2012-09-18 73 views
0

我只是想知道是否有人遇到過如何應用C#中的工具條組合框輸入掩碼?爲ToolStripComboBox應用輸入掩碼C#

我的下拉框會隨着時間的推移而填充IP地址,我想限制用戶能夠寫入的內容(例如:只能輸入3'。's,只有數字等)。

所以,如果任何人能夠幫助我會非常感激!

在此先感謝。

編輯

我的設計已經改變了,所以我現在需要有一個ToolStripComboBox控件

+0

也許我可以申請正則表達式?但是我怎麼去做呢? – Feytality

+0

ToolStipComboBox和ComboBox之間應該沒有任何區別。下面的兩個解決方案應該在兩個選項之間保持一致。 – Trisped

+0

@Trisped這是不正確的,因爲ToolStripComboBox不繼承ListControl,這是我知道格式化的知道。 – Feytality

回答

1

你可以嘗試捕捉KeyUp event,然後檢查輸入有效。如果不能恢復到最後一個有效輸入。你可能會想要做類似於Validating事件的事情(確保CausesValidation爲真)。

另一種選擇是創建一個MaskedTextBox並放置它,使其覆蓋下拉菜單的文本框部分。然後,您需要連接事件,以便兩個表單控件保持同步。

您還可以查看ErrorProvider類。

還有一些其他方法(例如運行時間爲0.3秒的計時器),但這些方式通常性能不佳或難以維護。

更新的正則表達式評論
如果我是這樣做我可能會使用一個正則表達式,否則我就會手動解析字符串。 無論採用哪種方式,KeyUp和Validating事件都會檢查控件的驗證。 KeyUp事件讓我可以在他們鍵入時進行檢查,而驗證事件允許我驗證控件何時失去焦點。你使用哪個取決於你想要的用戶體驗。

如果您沒有使用KeyUp事件進行驗證,您可以添加一個定時器,它在最後一次按鍵後運行5秒鐘。這樣,控件就不會失去焦點來顯示錯誤。

更新編輯的問題和評論
你的問題是如何格式化用戶輸入,事情不是如何添加到列表中,您不能使用​​事件。因此,該解決方案不適用於ToolStripComboBoxComboBox

在閱讀有關ToolStripControlHost的文檔之後,您可能會將ToolStripComboBox轉換爲ComboBox。如果沒有,那麼您可以使用ToolStripControlHostComboBox放置到您的表單上。 - 這是不正確的或不必要的,請參閱下面的更新報價。

ToolStripControlHost是ToolStripComboBox,ToolStripTextBox和ToolStripProgressBar的抽象基類。ToolStripControlHost可以承載其他控件,包括自定義的控制,有兩種方式:

  • 構造一個ToolStripControlHost與從Control派生的類。要完全訪問託管的控件和屬性,必須將Control屬性重新轉換爲它所表示的實際類。

  • 擴展ToolStripControlHost,並在繼承的類的默認構造函數中,調用傳遞從Control派生的類的基類構造函數。該選項允許您打包常用控制方法和屬性,以便在ToolStrip中輕鬆訪問。

使用ToolStripControlHost類來託管您的自定義控件或任何其他Windows窗體控件。

要自定義ToolStripItem,請從ToolStripControlHost派生並創建自定義實現。您可以重寫OnSubscribeControlEvents等方法來處理由託管控件引發的事件,並且可以將自定義功能置於屬性中以增強託管控件。

更新: 按照ToolStripComboBox文檔,您可以通過ToolStripComboBoxComboBox屬性訪問底層ComboBox

這就是爲什麼我通常在使用它之前閱讀控件上的文檔。我可能不瞭解它,但至少我會知道要尋找什麼。 :)

1

你應該這樣創建Format事件:

private void comboBox1_Format(object sender, ListControlConvertEventArgs e) 
    { 
     e.Value = GetFullIpFormat((string)e.Value); 
    } 

這裏是格式化值碼:

string GetFullIpFormat(string value) 
    { 
     string[] ip = new string[4]; 
     for (int i = 0; i < ip.Length; i++) 
     { 
      ip[i] = GetIpPart(i, value); 
     } 
     return string.Format("{0:###}.{1:###}.{2:###}.{3:###}", ip[0], ip[1], ip[2], ip[3]); 
    } 

    string GetIpPart(int partNumber, string ip) 
    { 
     string result = "000"; 
     int iLen = 3; 
     ip = ip.Replace(".", ""); 
     int iStart = partNumber * iLen; 
     if (ip.Length > iStart) 
     { 
      result = ip.Substring(iStart); 
      if (result.Length > iLen) 
      { 
       result = result.Substring(0, iLen); 
      } 
     } 
     return result; 
    } 

這會爲你做格式化。 另外,您可以檢查相同的事件數字輸入。 這會爲你做好工作,快樂的編碼! :)