2008-12-24 36 views
45

我不希望用戶能夠更改組合框中顯示的值。我一直在使用Enabled = false,但它使文本變灰,所以它不易讀。我希望它的行爲類似於文本框ReadOnly = true,文本顯示正常,但用戶無法編輯。如何在winforms中只編制Combobox

有沒有辦法完成這個?

回答

18

文章ComboBox-with-read-only-behavior提出一個有趣的解決方案:

同時創建一個只讀文本框,並在同一個地方的組合框。當你想要只讀模式時,顯示文本框,當你想要它可編輯時,顯示組合框。

+0

Downvoted because this answer is not realy useful。標準組合框控件已經提供了@amar vashi指出的所需功能。 – Andreas 2018-03-09 19:42:41

8

我可以建議最好的辦法是,以取代只讀文本框的組合框(或者也許只是一個標籤) - 這種方式,用戶仍可以選擇/複製值等

中當然,另一面露戰術將設置DropDownStyleDropDownList,只是刪除所有其他選項 - 那麼用戶有沒有別的挑選;-p

8

不知道這是你在找什麼,但..

設置DropDownStyle = DropDownList

然後在SelectedIndexChanged事件

If (ComboBox1.SelectedIndex <> 0) 
{ 
    ComboBox1.SelectedIndex = 0 
} 

這醜陋的部分是,他們會「感覺」像他們可以改變它。他們可能會認爲這是一個錯誤,除非你給他們一個警告,告訴他們爲什麼他們不能改變價值。

1

您可以將啓用組合框的前景色和背景色更改爲系統顏色,但這可能會讓用戶感到困惑(爲什麼如果他們無法更改它),它會更好看。

127

使DropDownStyle財產DropDownList而不是DropDown 然後處理TextChanged事件,以防止用戶更改文本。

+11

爲什麼這不是正確答案?快速,簡單,不會重新發明輪子。 – DoubleDunk 2013-09-20 17:54:51

+8

這不會阻止用戶從編輯文本中選擇不同的選項。 – billpg 2013-09-25 11:38:02

+4

這可能不是正確的答案,但對於我們中的56個人(在寫作時),這是我們正在尋找的答案(如何禁用編輯文本)。 – Bretticus 2014-07-07 19:08:13

0

爲什麼不使用文本框?文本框有一個「只讀」屬性,並且由於您只希望組合框顯示數據,所以我不明白爲什麼您需要組合框。

另一種方法是,您只需取消「on value changed」事件的輸入。這樣,你會顯示你的信息沒有母校做什麼用戶...

0

事實上,其相當簡單:

Private Sub combobox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles combobox1.KeyDown 
    ' the following makes this the combobox read only  
    e.SuppressKeyPress = True  
End Sub 
+1

簡單但不起作用。這並不妨礙人們從組合框中選擇另一個項目。 – 2012-07-18 16:59:59

1

下面是隻讀組合的最佳解決方案。

private void combo1_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    e.KeyChar = (char)Keys.None; 
} 

它將放棄Combo的按鍵。

-1

以下是ReadOnly Combo的最佳解決方案。

private void combo1_KeyPress(object sender, KeyPressEventArgs e) { 
    e.KeyChar = (char)Keys.None; 
} 

它將放棄Combo的按鍵。它沒有「e。!KeyChar

4

我已經通過繼承組合框添加一個只讀屬性來處理它隱藏自身設置時,並在含有相同的文字頂部顯示只讀文本框:

class ComboBoxReadOnly : ComboBox 
{ 
    public ComboBoxReadOnly() 
    { 
     textBox = new TextBox(); 
     textBox.ReadOnly = true; 
     textBox.Visible = false; 
    } 

    private TextBox textBox; 

    private bool readOnly = false; 

    public bool ReadOnly 
    { 
     get { return readOnly; } 
     set 
     { 
      readOnly = value; 

      if (readOnly) 
      { 
       this.Visible = false; 
       textBox.Text = this.Text; 
       textBox.Location = this.Location; 
       textBox.Size = this.Size; 
       textBox.Visible = true; 

       if (textBox.Parent == null) 
        this.Parent.Controls.Add(textBox); 
      } 
      else 
      { 
       this.Visible = true; 
       this.textBox.Visible = false; 
      } 
     } 
    } 
} 
0

集210物業Simple

添加下面的代碼向KeyPress事件組合框的

private void comboBoxName_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    e.Handled = true; 
    return; 
} 

添加下面的代碼向KeyDown事件組合框

private void comboBoxName_KeyDown(object sender, KeyEventArgs e) 
{ 
    e.Handled = true; 
    return; 
} 
0

的如果您已經填充它,並選中相應的項目,並使其成爲DropDownList,那麼您可以使用類似這樣的擴展方法將選擇列表快速減少到所選項目:

public static void MakeReadOnly(this ComboBox pComboBox) { 
    if (pComboBox.SelectedItem == null) 
     return; 

    pComboBox.DataSource = new List<object> { 
     pComboBox.SelectedItem 
    }; 
} 
0

我知道我有點遲到了,但我研究這個問題詢問,我知道必須有一些方法來使組合框只讀就好像它是一個文本框和禁用列表彈出。這並不完美,但它肯定比我在互聯網上找到的所有答案都好,這些答案對我來說都不合適。按下按鈕並調用OnDropDown後,會創建一個新線程,將DroppedDown屬性設置爲false,從而創建「沒有任何事情發生」的效果。鼠標滾輪被消耗並且關鍵事件也被消耗。

using System; 
using System.Threading; 
using System.Windows.Forms; 

namespace Test_Application 
{ 
    class ReadOnlyComboBox : ComboBox 
    { 
     private bool _readOnly; 
     private bool isLoading; 
     private bool indexChangedFlag; 
     private int lastIndex = -1; 
     private string lastText = ""; 

     public ReadOnlyComboBox() 
     { 
     } 

     public bool ReadOnly 
     { 
      get { return _readOnly; } 
      set { _readOnly = value; } 
     } 

     protected override void OnDropDown(EventArgs e) 
     { 
      if (_readOnly) 
      { 
       DropDownHeight = 1; 
       var t = new Thread(CloseDropDown); 
       t.Start(); 
       return; 
      } 
      base.OnDropDown(e); 
     } 

     private delegate void CloseDropDownDelegate(); 
     private void WaitForDropDown() 
     { 
      if (InvokeRequired) 
      { 
       var d = new CloseDropDownDelegate(WaitForDropDown); 
       Invoke(d); 
      } 
      else 
      { 
       DroppedDown = false; 
      } 
     } 
     private void CloseDropDown() 
     { 
      WaitForDropDown(); 
     } 

     protected override void OnMouseWheel(MouseEventArgs e) 
     { 
      if (!_readOnly) 
       base.OnMouseWheel(e); 
     } 

     protected override void OnKeyDown(KeyEventArgs e) 
     { 
      if (_readOnly) 
      { 
       switch (e.KeyCode) 
       { 
        case Keys.Back: 
        case Keys.Delete: 
        case Keys.Up: 
        case Keys.Down: 
         e.SuppressKeyPress = true; 
         return; 
       } 
      } 
      base.OnKeyDown(e); 
     } 

     protected override void OnKeyPress(KeyPressEventArgs e) 
     { 
      if (_readOnly) 
      { 
       e.Handled = true; 
       return; 
      } 
      base.OnKeyPress(e); 
     } 
    } 
} 
5

enter link description here

只要改變DropDownStyleDropDownList。或者如果你想要它完全只讀,你可以設置Enabled = false,或者如果你不喜歡的外觀,我有時有兩個控件,一個只讀文本框和一個組合框,然後隱藏組合並顯示文本框,如果它應該是完全的只讀,反之亦然。

0

在代碼最簡單的方法:

代替添加方法爲KeyPressKeyDown, 上 'Form1_Load' 的方法添加以下代碼:

comboBox1.KeyPress += (sndr, eva) => eva.Handled = true;

comboBox1.KeyDown += (sndr, eva) => eva.SuppressKeyPress = true;

(sndr, eva)(object sender, EventArgs e)

1

邁克爾·R的源碼工作,但... 的 「DropDownHeight = 1;」必須將ReadOnly屬性設置爲false時恢復爲默認值。因此,在「base.OnDropDown(e)」之前插入: DropDownHeight = 106;

using System; 
using System.Threading; 
using System.Windows.Forms; 

namespace Test_Application 
{ 
    class ReadOnlyComboBox : ComboBox 
    { 
     private bool _readOnly; 
     private bool isLoading; 
     private bool indexChangedFlag; 
     private int lastIndex = -1; 
     private string lastText = ""; 

     public ReadOnlyComboBox() 
     { 
     } 

     public bool ReadOnly 
     { 
      get { return _readOnly; } 
      set { _readOnly = value; } 
     } 

     protected override void OnDropDown (EventArgs e) 
     { 
      if (_readOnly) 
      { 
       DropDownHeight = 1; 
       var t = new Thread(CloseDropDown); 
       t.Start(); 
       return; 
      } 
      DropDownHeight = 106; //Insert this line. 
      base.OnDropDown(e); 
     } 

     private delegate void CloseDropDownDelegate(); 
     private void WaitForDropDown() 
     { 
      if (InvokeRequired) 
      { 
       var d = new CloseDropDownDelegate (WaitForDropDown); 
       Invoke(d); 
      } 
      else 
      { 
       DroppedDown = false; 
      } 
     } 
     private void CloseDropDown() 
     { 
      WaitForDropDown(); 
     } 

     protected override void OnMouseWheel (MouseEventArgs e) 
     { 
      if (!_readOnly) 
       base.OnMouseWheel(e); 
     } 

     protected override void OnKeyDown (KeyEventArgs e) 
     { 
      if (_readOnly) 
      { 
       switch (e.KeyCode) 
       { 
        case Keys.Back: 
        case Keys.Delete: 
        case Keys.Up: 
        case Keys.Down: 
         e.SuppressKeyPress = true; 
         return; 
       } 
      } 
      base.OnKeyDown(e); 
     } 

     protected override void OnKeyPress (KeyPressEventArgs e) 
     { 
      if (_readOnly) 
      { 
       e.Handled = true; 
       return; 
      } 
      base.OnKeyPress(e); 
     } 
    } 
} 

要完成這樣的回答:文件 - 新建 - 項目...... - 的Visual C# - 窗 - 經典桌面 - Windows窗體控件庫 - 鍵入您控制的名稱 - 確定並粘貼此代碼。您可以選擇您的dll文件的名稱:Project - 您的項目屬性... - 程序集名稱 - 輸入名稱。只需構建解決方案,並擁有自己的dll文件。因此,打開您想要使用只讀組合的項目,右鍵單擊參考 - 添加參考...並瀏覽您的dll文件。要將自定義組件插入到工具箱中,請打開工具箱,右鍵單擊常規選項卡 - 選擇項目... - 瀏覽您的dll文件 - 打開。現在你可以在你的項目中使用你的ReadOnlyComboBox。 PS:我正在使用VS2015。

相關問題