2009-04-08 36 views
11

Tôi sử dụng mã bên dưới để truy cập các thuộc tính trên biểu mẫu của tôi, nhưng hôm nay tôi muốn viết nội dung vào một ListView, yêu cầu nhiều thông số hơn.C# Cách gọi với nhiều tham số

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

Cách thêm nhiều thông số và cách sử dụng chúng (giá trị, giá trị)?

Trả lời

27

(chỉnh sửa - Tôi nghĩ là tôi hiểu lầm câu hỏi ban đầu)

Đơn giản chỉ cần làm cho nó một phương pháp thay vì một tài sản:

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

quát, Bạn có thể làm như sau

  • Trong C# 2012/Net 4.5 Tạo dự án Ứng dụng Biểu mẫu Windows có tên Lambda1
  • Trong m1 Mẫu, chèn một Label gọi label1
  • Nhấn F4 để mở các thuộc tính Form1 (không phải là thuộc tính label1)
  • Bấm vào sự kiện xem (Biểu tượng với sấm sét)
  • Double click vào sự kiện Mẫu Bế mạc. Trình xử lý sự kiện sẽ được tạo.
  • Đừng bận tâm về trình xử lý sự kiện ngay bây giờ. Nó sẽ được thay thế bằng một cái khác sau đó;
  • Chọn và xóa tất cả mã trong Form.cs (Phím Ctrl-A/Delete)
  • Sao chép và dán mã sau vào 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; 
    } 
} 

} 

gì mã này làm là:

Một giờ được tạo ra. Các gian đã qua Event Handler

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

sẽ được gọi mỗi 1000ms

các label1.Text sẽ được cập nhật trong xử lý sự kiện này. Nếu không có sự Invoke, sẽ có một sợi ban hành

Để cập nhật label1.Text với một giá trị mới, các mã được sử dụng


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

hãy thấy rằng c và d đang được được chuyển làm đối số cho x1 và x2 trong hàm Invoke và x1 được trả về trong lời gọi Invoke.

Biến d được chèn vào trong mã này chỉ để hiển thị cách chuyển nhiều hơn một biến khi Gọi được gọi.

Các vấn đề liên quan