Pergunta

Eu uso o código abaixo para acessar as propriedades no meu formulário, mas hoje eu gostaria de material da escrita a um ListView, o que requer mais parâmetros.

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

Como adicionar mais de um parâmetro e como usá-los (valor, valor)?

Foi útil?

Solução

( Editar - Eu acho que eu não entendi a pergunta original)

Basta torná-lo um método em vez de uma propriedade:

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

Outras dicas

Genericamente, você pode fazer as seguintes

  • Em C # 2012 / Net 4.5 Criar projeto de aplicativo chamado Lambda1 Windows Forms
  • No formulário Form1, insira uma etiqueta chamada label1
  • Pressione F4 para abrir as propriedades Form1 (não as propriedades LABEL1)
  • Clique na exibição Eventos (ícone com um trovão)
  • Clique duas vezes no evento Form Encerramento. Um manipulador de eventos será criado.
  • não se importa sobre o manipulador de eventos para agora. Ele será substituído por um outro mais tarde;
  • Selecionar e apagar todo o código na Form.cs (Ctrl-A / tecla Delete)
  • Copie e cole o seguinte código para 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;
    }
}

}

O que isto faça código é:

é criado

Um timer. O manipulador de eventos decorrido

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

será chamado a cada 1000ms

O Label1.Text será atualizado dentro deste manipulador de eventos. Sem a invocação, haverá um fio emitido

Para atualizar o Label1.Text com um novo valor, foi utilizado o código


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

Por favor, veja que c e d estão sendo passados ??como argumento para X1 e X2 na função de invocar e x1 é devolvido na chamada Invoke.

O d variável foi inserido neste código apenas para mostrar como passar mais de uma variável quando Invoke é chamado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top