【发布时间】:2013-01-02 14:26:43
【问题描述】:
解决方案
我现在对此很自责,但是您会在下面的代码中注意到,我正在为 Form4 使用参数化构造函数。 C# 中参数化构造函数的标准过程是在声明之后使用:this()(我认为,至少对于 Forms)。这首先调用未参数化/默认构造函数,其中包含InitializeComponent(),它设置表单及其控件。
:this(),InitializeComponent() 绝对应该不在参数化构造函数中,因为它使用“新”控件重新初始化您的表单。这会导致您的表单和控件处于模棱两可的状态,以及我得到的奇怪行为。
原始问题
我有一个表单,我希望控件(包括文本框)在第一个视图中具有初始值。这些值来自表单构建期间的一条 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;
}
【问题讨论】:
-
当您复制/粘贴控件时,您是使用设计器还是通过代码进行的?
-
@Coding Designer,不用手动指定位置,保留布局
-
您是否查看了设计器代码(通常隐藏在一个区域内)以确保它更新了所有内容以引用您粘贴的表单 to 并且没有仍然引用您粘贴的表格 来自?
-
事件处理程序真的被调用了吗?我看不到您在哪里连接事件处理程序(但可能在
InitializeComponent(). -
您可以使用从数据库中检索项目所需的任何选项在表单的构造函数上设置覆盖,而不是拥有多个表单。对 Add 版本使用默认构造函数,对 Edit 使用重载。或者,您可以从正在检索的数据中创建一个对象,并在创建表单之前加载该对象(Add 的“默认”对象),然后将其传递给单个构造函数。
标签: c# winforms textbox controls