我正在创建一个前端Windows窗体应用程序,该应用程序有多种用途。其中一种用途是允许最终用户管理数据库表的内容。
目前,我的表单包含一个DataGridView对象,该对象使用DataTable作为其源。该数据表由一个存储过程填充,该存储过程根据最终用户指定的条件从表中选择每一行。我希望将代码放入DataGridView中,该代码将查看用户选择的行,并将该行的详细信息填充到一系列文本框中。
我希望避免为DataGridView中的每一列硬编码文本框,因为将来我很可能会向基础存储过程添加列。因此,我的计划是,当用户第一次选择行时,应用程序将为每一列动态创建一个文本框,适当地调整文本框的大小(包括高度和宽度),并添加适当的标签。
到目前为止,我编写的代码创建了一个全新的DataTable,并添加了列来存储DataGridView中每一列的以下信息:
- DataGridView列的实际名称;
1.要给予关联标签的名称;
1.要分配给关联标签的文本;
1.关联标签的顶部和左侧位置;
1.要给予关联文本框的名称;
1.要在关联文本框中显示的值;
到目前为止,当用户最初单击一行时,一切都运行良好:这些文本框在垂直列中创建,每个文本框的左侧都有相关的标签,每个文本框中都显示相应的值。每个文本框的宽度都是根据文本框的内容动态设置的,这样就可以很容易地看到所有内容。
当使用者从DataGridView的一个数据列变更为另一个数据列时,就会发生困难。建立每个控件所执行的程式码如下所示:
if (pnlManageJobManagerOutcomes.Controls.Contains(txtCurrent))
{
pnlManageJobManagerOutcomes.Controls.Remove(txtCurrent);
}
if (!pnlManageJobManagerOutcomes.Controls.Contains(txtCurrent))
{
pnlManageJobManagerOutcomes.Controls.Add(txtCurrent);
}
当代码第一次运行时,一切似乎都很好。但是,如果它第二次被激发(此时它应该删除并重新创建控件),它似乎没有检测到控件的先前存在,只是在窗体中创建了它的第二个副本。
作为参考,我正在构建的表单有多种用途,这些用途由一系列按钮决定。因此,我在Panel(pnlManageJobManagerOutcomes)中创建了用于此特定用途的控件。我完全搞不懂为什么代码在后续执行过程中没有发现这些控件的存在。
短暂性脑缺血
1条答案
按热度按时间bz4sfanl1#
我已经想出了一个办法来做这件事,这似乎是笨拙的,但似乎工作。
由于我无法检查正在使用的面板是否包含字段名称,因此我编写了一个方法,该方法将遍历该面板中的控件,并返回该面板的Controls数组中该控件的示例数。如果该方法返回0,则意味着该控件在该面板中不存在,我可以继续创建它。