我只是想知道是否有人遇到過如何應用C#中的工具條組合框輸入掩碼?爲ToolStripComboBox應用輸入掩碼C#
我的下拉框會隨着時間的推移而填充IP地址,我想限制用戶能夠寫入的內容(例如:只能輸入3'。's,只有數字等)。
所以,如果任何人能夠幫助我會非常感激!
在此先感謝。
編輯
我的設計已經改變了,所以我現在需要有一個ToolStripComboBox控件
我只是想知道是否有人遇到過如何應用C#中的工具條組合框輸入掩碼?爲ToolStripComboBox應用輸入掩碼C#
我的下拉框會隨着時間的推移而填充IP地址,我想限制用戶能夠寫入的內容(例如:只能輸入3'。's,只有數字等)。
所以,如果任何人能夠幫助我會非常感激!
在此先感謝。
編輯
我的設計已經改變了,所以我現在需要有一個ToolStripComboBox控件
你可以嘗試捕捉KeyUp event,然後檢查輸入有效。如果不能恢復到最後一個有效輸入。你可能會想要做類似於Validating事件的事情(確保CausesValidation爲真)。
另一種選擇是創建一個MaskedTextBox並放置它,使其覆蓋下拉菜單的文本框部分。然後,您需要連接事件,以便兩個表單控件保持同步。
您還可以查看ErrorProvider類。
還有一些其他方法(例如運行時間爲0.3秒的計時器),但這些方式通常性能不佳或難以維護。
更新的正則表達式評論:
如果我是這樣做我可能會使用一個正則表達式,否則我就會手動解析字符串。 無論採用哪種方式,KeyUp和Validating事件都會檢查控件的驗證。 KeyUp事件讓我可以在他們鍵入時進行檢查,而驗證事件允許我驗證控件何時失去焦點。你使用哪個取決於你想要的用戶體驗。
如果您沒有使用KeyUp事件進行驗證,您可以添加一個定時器,它在最後一次按鍵後運行5秒鐘。這樣,控件就不會失去焦點來顯示錯誤。
更新編輯的問題和評論:
你的問題是如何格式化用戶輸入,事情不是如何添加到列表中,您不能使用事件。因此,該解決方案不適用於ToolStripComboBox
或ComboBox
。
在閱讀有關ToolStripControlHost
的文檔之後,您可能會將ToolStripComboBox
轉換爲ComboBox
。如果沒有,那麼您可以使用ToolStripControlHost
將ComboBox
放置到您的表單上。 - 這是不正確的或不必要的,請參閱下面的更新報價。
ToolStripControlHost是ToolStripComboBox,ToolStripTextBox和ToolStripProgressBar的抽象基類。ToolStripControlHost可以承載其他控件,包括自定義的控制,有兩種方式:
構造一個ToolStripControlHost與從Control派生的類。要完全訪問託管的控件和屬性,必須將Control屬性重新轉換爲它所表示的實際類。
擴展ToolStripControlHost,並在繼承的類的默認構造函數中,調用傳遞從Control派生的類的基類構造函數。該選項允許您打包常用控制方法和屬性,以便在ToolStrip中輕鬆訪問。
使用ToolStripControlHost類來託管您的自定義控件或任何其他Windows窗體控件。
要自定義ToolStripItem,請從ToolStripControlHost派生並創建自定義實現。您可以重寫OnSubscribeControlEvents等方法來處理由託管控件引發的事件,並且可以將自定義功能置於屬性中以增強託管控件。
更新: 按照ToolStripComboBox
文檔,您可以通過ToolStripComboBox
的ComboBox
屬性訪問底層ComboBox
。
這就是爲什麼我通常在使用它之前閱讀控件上的文檔。我可能不瞭解它,但至少我會知道要尋找什麼。 :)
你應該這樣創建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;
}
這會爲你做格式化。 另外,您可以檢查相同的事件數字輸入。 這會爲你做好工作,快樂的編碼! :)
也許我可以申請正則表達式?但是我怎麼去做呢? – Feytality
ToolStipComboBox和ComboBox之間應該沒有任何區別。下面的兩個解決方案應該在兩個選項之間保持一致。 – Trisped
@Trisped這是不正確的,因爲ToolStripComboBox不繼承ListControl,這是我知道格式化的知道。 – Feytality