Domanda

Io uso il codice qui sotto per accedere alle proprietà sulla mia forma, ma oggi mi piacerebbe scrivere roba per un controllo ListView, che richiede più parametri.

    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 loro (il valore, il valore) usare?

È stato utile?

Soluzione

( modifica - Credo di aver capito male la domanda iniziale)

Semplicemente rendere 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);
}

Altri suggerimenti

Genericamente, si può fare come segue

  • In C # 2012 / Net 4.5 Creare un progetto applicazione Windows Form denominato Lambda1
  • Nella Form1 modulo, inserire un'etichetta chiamata label1
  • Premere F4 per aprire le proprietà di Form1 (non le proprietà Label1)
  • Fare clic sul vista Eventi (icona con un tuono)
  • Fare doppio clic sull'evento modulo di chiusura. verrà creato un gestore di eventi.
  • Non importa circa il gestore di eventi per ora. Sarà sostituito da un altro in seguito;
  • Seleziona e cancellare tutto il codice nella Form.cs (tasto Ctrl-A / Elimina)
  • Copia e incolla il seguente codice per 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;
    }
}

}

Che cosa fare di questo codice è il seguente:

Viene creato un timer. La trascorso Event Handler

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

sarà chiamato ogni 1000 ms

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

Per aggiornare la 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));

Si prega di vedere che c e d vengono passati come argomento di X1 e X2 in funzione Invoke e x1 viene restituito nella chiamata Invoke.

La variabile d è stato inserito in questo codice solo per mostrare come passare più di una variabile quando Invoke viene chiamato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top