C # Как вызвать с более чем одним параметром - PullRequest
11 голосов
/ 08 апреля 2009

Я использую приведенный ниже код для доступа к свойствам в моей форме, но сегодня я хотел бы написать материал для ListView, который требует больше параметров.

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

Как добавить более одного параметра и как их использовать (значение, значение)?

Ответы [ 2 ]

29 голосов
/ 08 апреля 2009

( edit - мне кажется, я неправильно понял исходный вопрос)

Просто сделайте это методом вместо свойства:

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 голосов
/ 08 декабря 2016

Как правило, вы можете сделать как следует

  • В C # 2012 / Net 4.5 Создайте проект приложения Windows Forms под названием Lambda1
  • В форму Form1, вставьте метку с названием label1
  • Нажмите F4, чтобы открыть свойства Form1 (не свойства label1)
  • Нажмите на вид событий (значок с громом)
  • Двойной щелчок по событию закрытия формы. Обработчик событий будет создан.
  • Пока не обращайте внимания на обработчик событий. Это будет заменено другим позже;
  • Выбрать и стереть весь код в Form.cs (клавиша Ctrl-A / Удалить)
  • Скопируйте и вставьте следующий код в 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;
    }
}

}

Что делает этот код:

Таймер создан. Обработчик прошедших событий

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

будет вызываться каждые 1000 мс

Метка label1.Text будет обновлена ​​внутри этого обработчика событий. Без Invoke будет выдана нить

Для обновления label1.Text новым значением использовался код


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

Обратите внимание, что c и d передаются в качестве аргумента x1 и x2 в функции Invoke, а x1 возвращается в вызове Invoke.

Переменная d была вставлена ​​в этот код только для того, чтобы показать, как передать более одной переменной при вызове Invoke.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...