C#ComboBox的油漆冻结了

C#ComboBox的油漆冻结了,c#,winforms,combobox,refresh,paint,C#,Winforms,Combobox,Refresh,Paint,我编写了相当大(4700行)的Windows窗体应用程序,用于协调制造工厂的三个部门。在整个应用程序中,我有许多组合框,所有组合框都工作得很好,但我有一个组合框,它的油漆在加载时工作得很好,但是一旦您更改选项卡并返回,组合框就会冻结。请注意:这是对象的顺序Form1>TableLayoutPanel>TabControl>TabPage>TableLayoutPanel>ComboBox 装载时: 更改选项卡后(它使用我刚刚单击的选项卡的任何背景进行绘制): 解决此问题的唯一方法是关闭应用程

我编写了相当大(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
我的尝试:
*选择ChangeCommitted事件并分别添加.Refresh()和.Invalidate()/.Update(),但未成功
*组合框的“绘图模式”属性设置为“正常”
*
*
*

我被难住了。有没有办法解决这个问题

编辑:可笑的是,我尝试了以下方法,但没有成功。控件保持隐藏状态

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();
        }

解决这个问题很容易。只需将
显示
成员代码,然后将
数据源
分配给组合框

因此,不是:

if (cbFGPN.DataSource == null)
{
    cbFGPN.DataSource = dt;
}
else
{
    cbFGPN.DataSource = null;
    cbFGPN.DataSource = dt;
}
cbFGPN.ValueMember = "material";
cbFGPN.DisplayMember = "material";
做:

为什么会这样

当您想要为已经填充的元素分配
DisplayMember
ValueMember
时,它会进入该元素中的每个对象,并向其写入用作
display
的内容和用作
value
成员的内容,并且每次他进入已经存在的对象时,它都会触发一些事件(如validated、validating、textChanged、dataSourceChanged和其他(这取决于元素)),当您需要触发10个事件*4700行时,它会“冻结”——完成时间太长

当您在数据源之前指定
Displaymember
ValueMember
,然后只更改一次数据源时,所有对象都继承
Display
Value
成员属性,并且不会触发事件,因此不会冻结


重要提示:由于我已经测试并使用了这个工具,所以除了
checkedListBox
ListBox
。由于某种原因,它不允许我在分配数据源之前分配
显示和值
成员。

解决这个问题非常简单。只需将
显示
成员代码将
数据源
分配给组合框之前

因此,不是:

if (cbFGPN.DataSource == null)
{
    cbFGPN.DataSource = dt;
}
else
{
    cbFGPN.DataSource = null;
    cbFGPN.DataSource = dt;
}
cbFGPN.ValueMember = "material";
cbFGPN.DisplayMember = "material";
做:

为什么会这样

当您想要为已经填充的元素分配
DisplayMember
ValueMember
时,它会进入该元素中的每个对象,并向其写入用作
display
的内容和用作
value
成员的内容,并且每次他进入已经存在的对象时,它都会触发一些事件(如validated、validating、textChanged、dataSourceChanged和其他(这取决于元素)),当您需要触发10个事件*4700行时,它会“冻结”——完成时间太长

当您在数据源之前指定
Displaymember
ValueMember
,然后只更改一次数据源时,所有对象都继承
Display
Value
成员属性,并且不会触发事件,因此不会冻结


重要提示:由于我已测试并使用此功能,因此除了
checkedListBox
ListBox
之外,其他地方都可以使用。由于某些原因,在分配数据源之前,它不允许我分配
显示和值
成员。

当UI切换到此选项卡时,是否有发生的事件?例如,组合框是否再次弹出初始化后重新生成?在该控件中我们讨论了多少ComboBoxItems?感谢LordWilmore,Aleksa Ristic能够解决我的问题。UI切换到此选项卡时是否发生了事件?例如,初始化后是否重新填充ComboxItems?在该控件中我们讨论了多少ComboxItems?Thanks LordWilmore,Aleksa Ristic能够解决我的问题。非常感谢!我所做的唯一更改是将值和显示成员添加到我已有的if语句中。
if(cbFGPN.DataSource==null){cbFGPN.DataSource=dt;cbFGPN.ValueMember=“material”;cbFGPN.DisplayMember=“material”}其他{cbFGPN.ValueMember=“material”cbFGPN.DisplayMember=“material”cbFGPN.DataSource=dt;}非常感谢!我所做的唯一更改是将值和显示成员添加到我已有的if语句中。
if(cbFGPN.DataSource==null){cbFGPN.DataSource=dt;cbFGPN.ValueMember=“material”cbFGPN.DisplayMember=“material”}else{cbFGPN.ValueMember=“material”cbFGPN.DisplayMember=“material”cbFGPN.DataSource=dt;}