解决方案
我现在对此很自责,但您会在下面的代码中注意到,我正在为 Form4 使用参数化构造函数。C# 中参数化构造函数的标准过程是:this()
在声明之后使用(我认为,至少对于 Forms)。这首先调用未参数化/默认构造函数,其中包含InitializeComponent()
设置表单及其控件。
InitializeComponent()
如果您使用过,绝对不应该在参数化构造函数中:this()
,因为它会使用“新”控件重新初始化您的表单。这会导致您的表单和控件处于模棱两可的状态,以及我得到的奇怪行为。
原始问题
我有一个表单,我希望控件(包括文本框)在第一个视图中具有初始值。这些值来自表单构建期间的一条 SQL 语句,因此我无法使用表单设计器。此表单的元素/控件也是从几乎相同的表单复制粘贴的,因为该表单是“添加”,而该表单是“编辑”
问题是这样的:使用调试器显示我成功地从 SQL 中获取了良好的数据,并且设置textbox.Text
成功,但是当显示表单时,它并没有反映所做的更改。这里的答案:https ://stackoverflow.com/a/7830769/1655707暗示可以简单地设置该值(大概在初始化或加载期间)。
我已经尝试在初始化期间、Load 事件和 Shown 事件中这样做,但这些都不起作用。打电话Refresh()
也Application.DoEvents()
无所作为。有什么我想念的吗?某些阻止此文本框正确更新/显示的事件?复制粘贴控件是否有意外的副作用?
我尝试并以这种方式设置的所有控件都不会显示更改后的值,但文本框是最简单的,因为它没有索引可以弄乱。
public Form4(int collIDFromParent, string collNameFromParent): this()
{
InitializeComponent();
retCollID = collIDFromParent;
retCollName = collNameFromParent;
//Initialize these here so they activate on first use0
button1.DialogResult = DialogResult.None;
button2.DialogResult = DialogResult.Cancel;
//PopulateEditData goes first for potential SQL failure
PopulateEditData();
textBox6.Text = "TEST";
}
private void Form4_Load_1(object sender, EventArgs e)
{
textBox1.Text = "TEST";
}
private void Form4_Shown_1(object sender, EventArgs e)
{
textBox2.Text = "TEST";
}
是的,他们设置了不同的文本框,但它们都不起作用,所以差别不大。
一个典型的文本框更改处理程序。有人可能会认为它当前的编写方式可能会引发某种重置,但注释掉一行并不会改变我担心的行为。
private void textBox6_TextChanged_2(object sender, EventArgs e)
{
retCollName = textBox6.Text;
}