C#ComboBox涂料冻结

时间:2018-09-05 16:30:22

标签: c# winforms combobox refresh paint

我编写了相当大的Windows Forms应用程序(4700行),以协调制造工厂中的三个部门。我在整个应用程序中有很多组合框,并且都可以完美地工作,但是我有一个组合框,其油漆在加载时效果很好,但是一旦更改选项卡并回来,组合框就会冻结。请注意:这是对象Form1> TableLayoutPanel> TabControl> TabPage> TableLayoutPanel> ComboBox的顺序。

加载时: enter image description here

更改选项卡后(它被涂上我刚刚单击的选项卡的任何背景): enter image description here

解决此问题的唯一方法是关闭应用程序并重新打开。只要我留在选项卡上,该控件在整个过程中都可以正常运行。

这是我为组合框加载数据的方式:

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

1 个答案:

答案 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行时,它“冻结” “-需要太长时间才能完成。

在数据源之前分配ValueMemberdisplay并仅更改数据源一次时,所有对象都继承valueDisplaymember成员属性,因此不会触发事件它不会冻结。

重要说明:正如我已经测试并使用此作品一样,到处都期望ValueMemberDisplay。由于某种原因,它不允许我在分配数据源之前分配Value个成员。