2009-04-08 10 views
11

Io uso il codice qui sotto per accedere alle proprietà sul mio modulo, ma oggi mi piacerebbe scrivere cose su un ListView, che richiede più parametri.C# Come richiamare con più di un parametro

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

Come aggiungere più di un parametro e come utilizzarli (valore, valore)?

risposta

27

(modifica - Penso che ho frainteso la domanda iniziale)

semplicemente lo rendono un metodo al posto di una proprietà:

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

Genericamente, Si può fare seguire

  • In C# 2012/Net 4.5 Creare un progetto di applicazione Windows Form denominato Lambda1
  • In the For m1 modulo, inserire un'etichetta chiamata label1
  • Premere F4 per aprire le proprietà Form1 (non le proprietà Label1)
  • Clicca sulle eventi vedi (icona con un tuono)
  • doppio click sull'evento modulo di chiusura. Verrà creato un gestore di eventi.
  • Non preoccuparti del gestore di eventi per ora. Sarà sostituito da un altro più tardi;
  • Selezionare e cancellare tutto il codice in Form.cs (tasto Ctrl-A/Canc)
  • Copia e incolla il seguente codice in 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; 
    } 
} 

} 

Cosa fare di questo codice è il seguente: si crea

Un timer. La trascorso Event Handler

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

sarà chiamato ogni 1000ms

Il label1.Text saranno aggiornate all'interno di questo gestore di eventi. Senza l'Invoke, ci sarà un filo rilasciato

Per aggiornare il label1.Text con un nuovo valore, il codice è stato utilizzato


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

prego vedere che ced sono in corso passato come argomento a x1 e x2 nella funzione Invoke e x1 viene restituito nella chiamata Invoke.

La variabile d è stata inserita in questo codice solo per mostrare come passare più di una variabile quando si chiama Invoke.

Problemi correlati