Winforms TextBox保留UserControl中的值

a1o7rhls  于 2022-11-17  发布在  其他
关注(0)|答案(1)|浏览(202)

我正在制作一个应用程序,其中有多个UserControl堆叠在一起。因此,元素如下所示:主窗体-〉用户单击主窗体上的UserControl 1,(UserControl 1)有一个面板,在该面板上显示了另一个带按钮的UserControl 2。当用户单击它时,它会显示另一个UserControl 3,然后该UserControl 3会显示在按钮下面的面板中。最后用户在文本框中输入一些文本。我需要来自MainForm中的文本框的数据,因此我通过EventHandlers将MainForm和UserControl连接起来,并传递我的ResponseModel,其中包含一些我需要传递给MainForm的数据。第一次这样做时,创建并显示一个项目,在该项目之后有一个“按钮”(用户控件),以防用户想创建另一个。但是当用户为新项键入不同的文本时,问题就来了,它会创建一个具有相同文本的项!!就像文本框从未更改过一样(我在构造函数上设置了一个调试点,以便每次文本框为空时都能看到)下面是一些代码和一个图像,让你看看这应该如何工作。而且当我第一次删除项目,然后不工作,以创建一个新的项目的一些原因。

以下是我从最后一个UserControl发送数据的方式:

if (tbx_list_name.Text == "") 
    MessageBox.Show("You can't create new list without a name!", "Can't create new list!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
else
    CreateListTextBoxHandler?.Invoke(this, new ListCreationResponseModel() {
        Code = id, ListName = tbx_list_name.Text
    });

下面是我创建最后一个具有文本框的UserControl的方法:

control.CreateListTextBoxHandler += GetHandlerData;
panel.Controls.Add(control);

这就是我如何获得下一级的数据(此实践继续通过几个更多的级返回到MainForm):

public void GetHandlerData(object sender, ListCreationResponseModel e)
{
    try
    {
        panel.Controls.Clear();
        CreateListButtonHandler?.Invoke(this, e);
    }
    catch (Exception ex)
    {
        _ = new ErrorHandler(ex);
    }
}
j0pj023g

j0pj023g1#

这里似乎有一个递归。GetHandlerData被添加到CreateListTextBoxHandler事件(或委托)中,并再次调用CreateListTextBoxHandlerCreateListTextBoxHandler将再次调用GetHandlerData ......但是tbx_list_name.Text只在顶层传递给模型一次,直到所有其他调用。
您可以通过传递对文本框的引用而不是文本本身来解决这个问题。这样您就可以始终检索文本框的当前文本。

public class ListCreationResponseModel
{
    private readonly TextBox _listNameTextBox;

    public ListCreationResponseModel(TextBox listNameTextBox)
    {
        _listNameTextBox = listNameTextBox;
    }

    public int Code { get; set; }
    public string ListName => _listNameTextBox .Text;
}

现在,当你检索ListName时,你得到的不是存储的值,而是文本框的实际文本。
您可以像这样建立行程常式:

CreateListTextBoxHandler?.Invoke(this, new ListCreationResponseModel(tbx_list_name) {
    Code = id
});

相关问题