[英]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;
}
為什么會發生?
當您要分配已經填充的元素的DisplayMember
和ValueMember
,它會轉到該元素中的每個對象,並向其寫入用作display
和用作value
成員的內容,並且每次他進入已經存在的對象時,它都會觸發少量事件(例如驗證,驗證,textChanged,dataSourceChanged等(取決於元素)),並且當您需要觸發10個事件* 4700行時,它會“凍結”-完成時間太長。
當您在數據源之前分配Displaymember
和ValueMember
然后僅更改數據源一次時,所有對象都將繼承Display
和Value
成員屬性,並且不會觸發事件,因此不會凍結。
重要說明:由於我已經對此進行了測試和使用,因此在所有地方都可以使用checkedListBox
和ListBox
。 由於某些原因,它不允許我在分配數據源之前分配Display and Value
成員。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.