2009-04-08 10 views
11

Ich verwende den folgenden Code, um auf die Eigenschaften in meinem Formular zuzugreifen, aber heute möchte ich Dinge in eine ListView schreiben, die mehr Parameter erfordert.C# So rufen Sie mit mehr als einem Parameter auf

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

Wie Sie mehr als einen Parameter hinzufügen und wie Sie sie verwenden (Wert, Wert)?

Antwort

27

(bearbeiten - ich glaube, ich die ursprüngliche Frage falsch verstanden)

einfach es ein Verfahren anstelle einer Immobilie:

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

generisch, können Sie tun, wie

    folgen
  • In C# 2012/Net 4.5 Erstellen Sie ein Windows Forms-Anwendungsprojekt namens Lambda1
  • In der For m1 Formular, fügen Sie ein Label namens label1
  • Drücken Sie F4, um die Form1 Eigenschaften zu öffnen (nicht die label1 Eigenschaften)
  • Klicken Sie auf die Ereignisansicht (Symbol mit einem Donner)
  • Klicken Sie doppelt auf das Formular Abschlussveranstaltung. Ein Event-Handler wird erstellt.
  • Haben Sie nichts dagegen, den Event-Handler für jetzt. Es wird später durch ein anderes ersetzt;
  • Wählen und löschen Sie den gesamten Code in Form.cs (Strg-A/Entf-Taste)
  • Kopieren Sie den folgenden Code und fügen Sie ihn in Form1.cs ein;

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; 
    } 
} 

} 

Was dieser Code tun ist:

Ein Timer erstellt wird. Die verstrichene Event Handler

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

wird jeder 1000ms

Die label1.Text in diesem Ereignishandler aktualisiert werden aufgerufen werden. Ohne die Invoke, wird es ein Thread

ausgegeben werden, um die label1.Text mit einem neuen Wert zu aktualisieren, wurde der Code


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

Bitte beachten Sie, dass c und d sind übergeben als Argument an x1 und x2 in der Invoke-Funktion und x1 wird im Invoke-Aufruf zurückgegeben.

Die Variable d wurde in diesen Code eingefügt, um anzuzeigen, wie mehr als eine Variable übergeben wird, wenn Invoke aufgerufen wird.

Verwandte Themen