2015-06-03 53 views
4

我有一個數據綁定這樣的組合框:C#的WinForms:添加「從列表中選擇...」佔位符數據綁定組合框

comboBox.InvokeIfRequired(delegate 
     { 
      var data = db.GetData(); 
      comboBox.DisplayMember = "Value"; 
      comboBox.ValueMember = "ID"; 
      comboBox.DataSource = data; 
     }); 

它工作正常,但它預選第一數據綁定值。我希望組合框被預先選定一些佔位符,如「從列表中選擇項目...」

這樣做的最佳方式是什麼?
a)添加數據變量空項
b)通過combobox設置變量屬性?如果是這樣,哪些?
c)其他

+1

但是我沒有'Items'集合中的佔位符,所以在'SelectedValue'屬性中沒有設置值。 –

+0

它需要是來自綁定數據的值,無論您想要預先選擇哪一個。 SelectedValue屬性設置器計算出SelectedIndex需要與之匹配的內容。 –

+0

好的,所以你說最好的方法是將一個佔位符項添加到'db.GetData();'函數並使用它的值來設置'combobox.SelectedValue'? –

回答

3

我發現這個here

代碼中的解決方案是這樣的:

private const int EM_SETCUEBANNER = 0x1501;   

    [DllImport("user32.dll", CharSet = CharSet.Auto)] 
    private static extern Int32 SendMessage(IntPtr hWnd, int msg, int wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam); 

    [DllImport("user32.dll")] 
    private static extern bool GetComboBoxInfo(IntPtr hwnd, ref COMBOBOXINFO pcbi); 
    [StructLayout(LayoutKind.Sequential)] 

    private struct COMBOBOXINFO 
    { 
     public int cbSize; 
     public RECT rcItem; 
     public RECT rcButton; 
     public UInt32 stateButton; 
     public IntPtr hwndCombo; 
     public IntPtr hwndItem; 
     public IntPtr hwndList; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    private struct RECT 
    { 
     public int left; 
     public int top; 
     public int right; 
     public int bottom; 
    } 

    public static void SetCueText(Control control, string text) 
    { 
     if (control is ComboBox) 
     { 
      COMBOBOXINFO info = GetComboBoxInfo(control); 
      SendMessage(info.hwndItem, EM_SETCUEBANNER, 0, text); 
     } 
     else 
     { 
      SendMessage(control.Handle, EM_SETCUEBANNER, 0, text); 
     } 
    } 

    private static COMBOBOXINFO GetComboBoxInfo(Control control) 
    { 
     COMBOBOXINFO info = new COMBOBOXINFO(); 
     //a combobox is made up of three controls, a button, a list and textbox; 
     //we want the textbox 
     info.cbSize = Marshal.SizeOf(info); 
     GetComboBoxInfo(control.Handle, ref info); 
     return info; 
    } 

然後您就可以簡單的使用它像這樣:

SetCueText(comboBox, "text"); 

這也適用於文本框。

+0

我知道這是一箇舊的帖子,但有沒有辦法讓DropDownStyle設置爲DropDownList的組合框的工作?它只在設置爲DropDown時纔有效。 – nerdalert

0

只需使用文本屬性和寫有「從列表中選擇項...」

+0

我很害怕'數據綁定時'Text'屬性將被覆蓋。我試過這種方法,但它沒有工作 –

相關問題