C#ComboBox油漆很冷

问题描述 投票:0回答:1

我有相当大的(4700行)Windows窗体应用程序,我写这个应用程序来协调我的制造工厂中的三个部门。我在整个应用程序中有很多组合框,并且所有组合工作都很完美,但是我有一个组合框可以在加载时正常工作,但是一旦你更换标签并返回,组合框就会被冻结。请注意:这是对象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();
        }
c# winforms combobox refresh paint
1个回答
1
投票

解决这个问题非常容易。在将Value分配给组合框之前,只需将Displaydatasource成员代码放入。

而不是:

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

为什么会这样?

当你想要分配已填充元素的DisplayMemberValueMember时,它会转到该元素中的每个对象并写入要用作display的内容以及value成员的内容以及每次进入已经存在的对象时它会触发很少的事件(如验证,验证,textChanged,dataSourceChanged和其他(它取决于元素))当你需要像10个事件* 4700行一样开火时它会“冻结” - 需要很长时间才能完成。

当您在datasource之前分配DisplaymemberValueMember然后只更改数据源一次时,所有对象都会继承DisplayValue成员属性,并且不会触发事件,因此它不会冻结。

重要提示:由于我已经测试并使用过这项工作,所以到处都期待checkedListBoxListBox。出于某种原因,它不允许我在分配数据源之前分配Display and Value成员。

© www.soinside.com 2019 - 2024. All rights reserved.