2010-03-26 91 views
0

我想寫一個方法,它需要一個ComboBox,一個DataTable和一個TextBox作爲參數。它的目的是根據TextBox.Text過濾組合框中顯示的成員。 DataTable包含將被過濾的可能條目的整個列表。爲了過濾,我創建了DataTable的DataView,添加一個RowFilter,然後將此View作爲DataSource綁定到ComboBox。在樣式爲「DropDownList」的ComboBox中使用空行作爲默認行?

爲了防止用戶輸入到組合框中,我選擇了DropDownStyle DropDownList。目前爲止工作正常,除了用戶還應該能夠選擇任何內容/空行。事實上,這應該是要顯示的默認成員(以防止偶然選擇錯誤的成員,如果用戶通過對話快速點擊)。

我試圖通過向視圖添加新行來解決此問題。雖然這適用於某些情況,但這裏的主要問題是任何DataTable都可以傳遞給方法。如果DataTable包含的列不能爲空並且不包含默認值,那麼我想通過添加一個空行來引發錯誤。

可能會創建一個視圖,其中只包含定義爲DisplayMember的列和定義爲ValueMember的視圖。唉,這不能用C#中的視圖來完成。我想避免不惜一切代價創建DataTable的真實副本,因爲誰知道它會隨着時間的推移會有多大。

你有什麼建議如何解決這個問題?

而不是一個視圖,我可以創建一個包含兩個成員的對象,並將DisplayMember和ValueMember分配給這些成員?成員會被作爲參考傳遞(我希望)還是會被真實複製創建(在這種情況下,它不會是一種解決方案)?

非常感謝您的幫助!

問候

public static void ComboFilter(ComboBox cb, DataTable dtSource, TextBox filterTextBox) 
{ 
cb.DropDownStyle = ComboBoxStyle.DropDownList; 
string displayMember = cb.DisplayMember; 
DataView filterView = new DataView(dtSource); 
filterView.AddNew(); 
filterView.RowFilter = displayMember + " LIKE '%" + filterTextBox.Text + "%'"; 
cb.DataSource = filterView; 
} 
+0

P.S.對不起,代碼有點搞砸了:( – 2010-03-26 08:59:22

+0

對於代碼格式化,選擇你的代碼部分,並給予坦克提示Ctrl + K – Amsakanna 2010-03-26 09:03:09

+0

!但是我不能編輯/糾正我的問題,我可以嗎? – 2010-03-26 09:09:29

回答

0

好了,一次偶然的機會,我碰上了一個有效的解決方案:任何更改到DataView - 比如添加一個新行 - 都應該使用.EndEdit完成。如果你不這樣做,你會面臨副作用,比如添加的行沒有正確排序。但是:通過不添加.EndEdit,您還會獲得一個優勢:如果底層DataTable(dtSource)中的任何列不允許爲null,C#將不會檢查!

因此,作爲解決方案,我添加了.EndEdit到try-Block。如果DataTable允許每列都爲空,它將起作用,空行將出現在組合框的頂部。但是,如果它不允許null,EndEdit將不會執行,但是仍然會在ComboBox的底部添加空行。

請注意,如果您在dtSource中設置了自動增量,則空行也將返回SelectedValue(最可能是-1)。使用這種方法時需要考慮這一點!

乾杯!

public static void ComboFilter(ComboBox cb, DataTable dtSource, TextBox filterTextBox) 
{ 
    cb.DropDownStyle = ComboBoxStyle.DropDownList; 
    string displayMember = cb.DisplayMember; 
    DataView filterView = new DataView(dtSource); 
    DataRowView newRow = filterView.AddNew(); 
    newRow[displayMember] = ""; 
    try { newRow.EndEdit(); } // fails, if a column in dtSource does not allow null 
    catch (Exception) { }  // works, but the empty line will appear at the end 
    filterView.RowFilter = displayMember + " LIKE '%" + filterTextBox.Text + "%'"; 
    filterView.Sort = displayMember; 
    cb.DataSource = filterView; 
}