繁体   English   中英

lambda 表达式事件侦听器中的空字符串 Textbox.Text

[英]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()中订阅。

现在,这里的问题是因为updateCustomerBttnHandleID之前被订阅,所以当事件被调用时它也在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM