簡體   English   中英

C#ComboBox塗料凍結

[英]C# ComboBox paint is freezing

我編寫了相當大(4700行)的Windows Forms應用程序,以協調生產工廠中的三個部門。 我在整個應用程序中有很多組合框,並且都可以完美地工作,但是我有一個組合框,其油漆在加載時效果很好,但是一旦更改選項卡並回來,組合框就會凍結。 請注意:這是對象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選項卡
* 懸浮塗料
* 強制油漆事件

我很沮喪 有想法該怎么解決這個嗎?

編輯:只是可笑,我嘗試以下沒有成功。 控件保持隱藏狀態。

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

解決這個問題很容易。 在將datasource分配給組合框之前,只需輸入“ Value和“ Display成員代碼。

所以代替:

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行時,它會“凍結”-完成時間太長。

當您在數據源之前分配DisplaymemberValueMember然后僅更改數據源一次時,所有對象都將繼承DisplayValue成員屬性,並且不會觸發事件,因此不會凍結。

重要說明:由於我已經對此進行了測試和使用,因此在所有地方都可以使用checkedListBoxListBox 由於某些原因,它不允許我在分配數據源之前分配Display and Value成員。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM