我编写了相当大的Windows Forms应用程序(4700行),以协调制造工厂中的三个部门。我在整个应用程序中有很多组合框,并且都可以完美地工作,但是我有一个组合框,其油漆在加载时效果很好,但是一旦更改选项卡并回来,组合框就会冻结。请注意:这是对象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();
}
答案 0 :(得分:1)
解决方案非常容易。在将page_size
分配给组合框之前,只需放置public static int largestPossibleNumber(int numDigits) {
return (int) (Math.pow(10, numDigits)) - 1;
}
和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
和用作{{1 }}成员,并且每次他进入已经存在的对象时,它都会触发少量事件(例如validated,validating,textChanged,dataSourceChanged和其他事件(取决于元素)),并且当您需要触发10个事件* 4700行时,它“冻结” “-需要太长时间才能完成。
在数据源之前分配ValueMember
和display
并仅更改数据源一次时,所有对象都继承value
和Displaymember
成员属性,因此不会触发事件它不会冻结。
重要说明:正如我已经测试并使用此作品一样,到处都期望ValueMember
和Display
。由于某种原因,它不允许我在分配数据源之前分配Value
个成员。