我正在制作一个应用程序,其中有多个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);
}
}
1条答案
按热度按时间j0pj023g1#
这里似乎有一个递归。
GetHandlerData
被添加到CreateListTextBoxHandler
事件(或委托)中,并再次调用CreateListTextBoxHandler
,CreateListTextBoxHandler
将再次调用GetHandlerData
......但是tbx_list_name.Text
只在顶层传递给模型一次,直到所有其他调用。您可以通过传递对文本框的引用而不是文本本身来解决这个问题。这样您就可以始终检索文本框的当前文本。
现在,当你检索
ListName
时,你得到的不是存储的值,而是文本框的实际文本。您可以像这样建立行程常式: