[英]Empty String Textbox.Text inside lambda expression event listener
感觉我在这里缺少一些简单的东西。 有一个看起来像这样的表格:
public partial class UpdateCustomerForm : Form
{
public UpdateCustomerForm(UpdateCustomer customer)
{
InitializeComponent();
updateCustomerBttn.Click += (sender, e) => HandleID(customer);
}
private void updateCustomerBttn_Click(object sender, EventArgs e)
{
string customerName = nameTb.Text; // This works
this.Close();
}
private void HandleID(UpdateCustomer customer)
{
//all below values are empty
UpdateCustomer customerToUpdate = new UpdateCustomer()
{
CustomerID = customer.CustomerID,
CustomerName = nameTb.Text,
Address1 = addressTb.Text,
Address2 = address2Tb.Text,
Phone = phoneTb.Text,
City = cityTB.Text,
Country = countryTb.Text
};
Customer.UpdateCustomer(customerToUpdate);
CustomerForm CustomerForm = (CustomerForm)Application.OpenForms["CustomerForm"];
CustomerForm.PopulateDGV();
}
}
我不明白为什么 HandleID 方法中没有表示所有文本框的 .text 值。 所有进来的都是空字符串。 我需要做些什么才能访问这些值吗? 谢谢!
对于那些有类似问题的人:
这里有两种订阅Click
事件的方法。 第一个是:
updateCustomerBttn.Click += (sender, e) => HandleID(customer);
第二个是:
private void updateCustomerBttn_Click(object sender, EventArgs e)
在InitializeComponent()
中订阅。
现在,这里的问题是因为updateCustomerBttn
在HandleID
之前被订阅,所以当事件被调用时它也在HandleID
之前被执行。 这意味着 Form 在HandleID
执行之前关闭,这导致了问题。
您当然可以更改订阅这两种方法的顺序,但是您已经看到随着时间的推移这会变得非常混乱。 所以更好的选择是将this.Close()
移动到HandleID
,或者 - 如果你想真正干净 - 将它添加到构造函数中的 lambda :
public partial class UpdateCustomerForm : Form
{
public UpdateCustomerForm(UpdateCustomer customer)
{
InitializeComponent();
updateCustomerBttn.Click += (sender, e) => {
HandleID(customer);
this.Close();
};
}
private void HandleID(UpdateCustomer customer)
{
UpdateCustomer customerToUpdate = new UpdateCustomer()
{
CustomerID = customer.CustomerID,
CustomerName = nameTb.Text,
Address1 = addressTb.Text,
Address2 = address2Tb.Text,
Phone = phoneTb.Text,
City = cityTB.Text,
Country = countryTb.Text
};
Customer.UpdateCustomer(customerToUpdate);
CustomerForm CustomerForm = (CustomerForm)Application.OpenForms["CustomerForm"];
CustomerForm.PopulateDGV();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.