我有相当大的(4700行)Windows窗体应用程序,我写这个应用程序来协调我的制造工厂中的三个部门。我在整个应用程序中有很多组合框,并且所有组合工作都很完美,但是我有一个组合框可以在加载时正常工作,但是一旦你更换标签并返回,组合框就会被冻结。请注意:这是对象Form1> TableLayoutPanel> TabControl> TabPage> TableLayoutPanel> ComboBox的顺序。
解决此问题的唯一方法是关闭应用程序并重新打开。只要我留在标签上,控件就可以在整个时间内完美运行。
这是我如何加载组合框的数据:
private void LoadFGPN()
{
SqlConnection con = new SqlConnection(Properties.Resources.Tef7_Conn);
SqlDataAdapter da;
DataTable dt = new DataTable();
StringBuilder sql = new StringBuilder();
sql.Append("SELECT DISTINCT(material) FROM [TEF7].[CM].[ALLPartNumbers] WHERE material LIKE '_____7______-6RP' OR material LIKE '_____4______-6RP' OR material LIKE '_________8__-6ML' OR material LIKE '_________[0-7,9]__-6ML'");
da = new SqlDataAdapter(sql.ToString(), con);
da.Fill(dt);
if (cbFGPN.DataSource == null)
{
cbFGPN.DataSource = dt;
}
else
{
cbFGPN.DataSource = null;
cbFGPN.DataSource = dt;
}
cbFGPN.ValueMember = "material";
cbFGPN.DisplayMember = "material";
} //loads finished good combo box on kanban
我尝试过的: * SelectionChangeCommitted事件并单独添加.Refresh()和.Invalidate()/ .Update()但没有成功。 *组合框的“绘制模式”属性设置为“正常” * winforms tabcontrol * suspend paint * force paint event
我很难过。有想法该怎么解决这个吗?
编辑:只是荒谬我试过以下没有成功。控件保持隐藏状态。
if (tcMain.SelectedIndex == 0)
{
cbFGPN.Hide();
LoadPreOrderGridview("eKanban", null, null, null, null, null); //loads preorder gridview
LoadFGPN();
LoadRawPN();
cbFGPN.Show();
tlpMain.Refresh();
tcMain.Refresh();
tpKanban.Refresh();
tlpKanban.Refresh();
pnKanban.Refresh();
cbFGPN.Refresh();
}
解决这个问题非常容易。在将Value
分配给组合框之前,只需将Display
和datasource
成员代码放入。
而不是:
if (cbFGPN.DataSource == null)
{
cbFGPN.DataSource = dt;
}
else
{
cbFGPN.DataSource = null;
cbFGPN.DataSource = dt;
}
cbFGPN.ValueMember = "material";
cbFGPN.DisplayMember = "material";
做:
cbFGPN.ValueMember = "material";
cbFGPN.DisplayMember = "material";
if (cbFGPN.DataSource == null)
{
cbFGPN.DataSource = dt;
}
else
{
cbFGPN.DataSource = null;
cbFGPN.DataSource = dt;
}
为什么会这样?
当你想要分配已填充元素的DisplayMember
和ValueMember
时,它会转到该元素中的每个对象并写入要用作display
的内容以及value
成员的内容以及每次进入已经存在的对象时它会触发很少的事件(如验证,验证,textChanged,dataSourceChanged和其他(它取决于元素))当你需要像10个事件* 4700行一样开火时它会“冻结” - 需要很长时间才能完成。
当您在datasource之前分配Displaymember
和ValueMember
然后只更改数据源一次时,所有对象都会继承Display
和Value
成员属性,并且不会触发事件,因此它不会冻结。
重要提示:由于我已经测试并使用过这项工作,所以到处都期待checkedListBox
和ListBox
。出于某种原因,它不允许我在分配数据源之前分配Display and Value
成员。