2009-04-08 7 views
11

J'utilise le code ci-dessous pour accéder aux propriétés de mon formulaire, mais aujourd'hui je voudrais écrire des choses dans un ListView, ce qui nécessite plus de paramètres.C# Comment invoquer avec plus d'un paramètre

public string TextValue 
    { 
     set 
     { 
      if (this.Memo.InvokeRequired) 
      { 
       this.Invoke((MethodInvoker)delegate 
       { 
        this.Memo.Text += value + "\n"; 
       }); 
      } 
      else 
      { 
       this.Memo.Text += value + "\n"; 
      } 
     } 
    } 

Comment ajouter plus d'un paramètre et comment les utiliser (valeur, valeur)?

Répondre

27

(modifier - Je pense que j'ai mal compris la question initiale)

Il suffit de faire une méthode au lieu d'une propriété:

public void DoSomething(string foo, int bar) 
{ 
    if (this.InvokeRequired) { 
     this.Invoke((MethodInvoker)delegate { 
      DoSomething(foo,bar); 
     }); 
     return; 
    } 
    // do something with foo and bar 
    this.Text = foo; 
    Console.WriteLine(bar); 
} 
0

génériquement, vous pouvez faire comme suivre

  • Dans C# 2012/Net 4.5 Créer un projet d'application Windows Forms appelé Lambda1
  • Dans le m1 formulaire, insérez une étiquette appelée label1
  • Appuyez sur F4 pour ouvrir les propriétés Form1 (pas les propriétés de LABEL1)
  • Cliquez sur l'affichage Événements (icône avec un tonnerre)
  • Double-cliquez sur l'événement de clôture du formulaire. Un gestionnaire d'événement sera créé. Cela ne vous dérange pas pour le gestionnaire d'événements pour l'instant. Il sera remplacé par un autre plus tard;
  • Sélectionnez et effacez tout le code dans Form.cs (touche Ctrl-A/Suppr)
  • Copiez et collez le code suivant dans Form1.cs;

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Linq.Expressions; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Diagnostics; 
namespace Lambda1 
{ 
public partial class Form1 : Form 
{ 

    System.Timers.Timer t = new System.Timers.Timer(1000); 
    Int32 c = 0; 
    Int32 d = 0; 
    Func<Int32, Int32, Int32> y; 

    public Form1() 
    { 

     InitializeComponent();   
     t.Elapsed += t_Elapsed; 
     t.Enabled = true; 
    } 

    void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     c = (Int32)(label1.Invoke(y = (x1, x2) => 
       { label1.Text = (x1 + x2).ToString(); 
           x1++; 
           return x1; }, 
           c,d)); 
     d++; 
    } 

    private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     t.Enabled = false; 
    } 
} 

} 

Qu'est-ce que ce code est faire:

Une minuterie est créé. Le gestionnaire d'événements Elapsed

void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 

sera appelé tous les 1000ms

Le Label1.Text sera mis à jour dans ce gestionnaire d'événements. Sans Invoke, il y aura un fil émis

Pour mettre à jour le Label1.Text avec une nouvelle valeur, le code a été utilisé


c = (Int32)(label1.Invoke(y = (x1, x2) => { label1.Text = (x1 + 
x2).ToString(); x1++; return x1; }, c,d)); 

S'il vous plaît voir que c et d sont en cours passé en argument à x1 et x2 dans la fonction Invoke et x1 est renvoyé dans l'appel Invoke.

La variable d a été insérée dans ce code juste pour montrer comment passer plus d'une variable quand Invoke est appelée.

Questions connexes