2014-11-01 64 views
0

我的表單中有幾個文本框。我想輸入一個文本框,其他文本框將被自動取消(取消,這樣用戶將無法在其他文本框中輸入)。 如果用戶刪除他在文本框中輸入的單詞(或換句話說:如果文本框爲空),則所有其他文本框將再次啓用。如果我在其他文本框中輸入,取消文本框

這是我走到這一步:

private void textBox1_TextChanged(object sender, EventArgs e) 
    { 
     if (textBox1.Text.Trim().Length > 0) 
     { 
      // Disable other textboxes (I have no idea how can I do that). 
     } 
     else if (textBox1.Text.Trim().Length == 0) 
     { 
      // Enable other textboxes 
     } 
    } 

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (textBox1.Text.Trim().Length > 0) 
     { 
      // Keep this comboBox enabled while typing in textBox1. 
     } 
    } 

如何禁用其他文本框,而在priticillar文本框輸入? (也保持comboBox啓用)。

注意:我想在textBox2上做同樣的事情(當我輸入textBox2時,文本框1和3將被禁用)和textBox3。

+0

順便說一句,這聽起來完全非常糟糕的用戶體驗。請不要這樣做。 – Aron 2014-11-01 15:32:53

+0

你也不會注意到你使用的是什麼UI技術。如果您使用的是WPF,那麼如果您使用WinForm,並且您在WebForm或MVC中執行此操作,則實際上可以通過使用Javascript來實現。 – Aron 2014-11-01 15:34:36

回答

1

你並不需要在你的「否則如果」,只是「別人」會做一個條件,因爲如果長度大於0,只有其他可能性爲0.也可以使用發件人而不是硬編碼控件名稱。

然後爲要禁用的文本框設置啓用屬性。您可以循環顯示錶單上的所有文本框,不包括要輸入的文本框,也可以手動列出它們。 SImpler將文本框放在一個組框中,然後如果禁用組框,它將禁用其中的控件。

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    var senderTextBox = (TextBox)sender; 
    var textBoxesEnabled = senderTextBox.Text.Trim().Length == 0; 

    textBox2.Enabled = textBoxesEnabled; 
    textBox3.Enabled = textBoxesEnabled; 

    // OR 

    groupBox1.Enabled = textBoxesEnabled; 
} 

答覆編輯:您可以文本框的鏈,說他們的4,禁用最後一個3,然後:

void TextBox1TextChanged(object sender, System.EventArgs e) 
{ 
    var isTextEmpty = ((TextBox)sender).Text.Trim() == ""; 
    textBox2.Enabled = !isTextEmpty; 
} 
void TextBox2TextChanged(object sender, System.EventArgs e) 
{ 
    var isTextEmpty = ((TextBox)sender).Text.Trim() == ""; 
    textBox1.Enabled = isTextEmpty; 
    textBox3.Enabled = !isTextEmpty; 
} 
void TextBox3TextChanged(object sender, System.EventArgs e) 
{ 
    var isTextEmpty = ((TextBox)sender).Text.Trim() == ""; 
    textBox2.Enabled = isTextEmpty; 
    textBox4.Enabled = !isTextEmpty; 
} 
void TextBox4TextChanged(object sender, System.EventArgs e) 
{ 
    var isTextEmpty = ((TextBox)sender).Text.Trim() == ""; 
    textBox3.Enabled = isTextEmpty; 
} 

但對於大量文本框的的,另一種選擇是有多個文本框份額相同的TextChanged事件。您需要點擊每個TextBox控件,進入事件列表並手動選擇TextChanged的方法。這裏是方法:

private void TextBoxGroup_TextChanged(object sender, EventArgs e) 
{ 
    var groupOrder = new List<TextBox>() { textBox1, textBox2, textBox3, textBox4 }; 
    var senderTextBox = (TextBox)sender; 
    var senderIndex = groupOrder.IndexOf(senderTextBox); 

    var isTextEmpty = senderTextBox.Text.Trim() == ""; 
    if (senderIndex != 0) groupOrder[senderIndex - 1].Enabled = isTextEmpty; 
    if (senderIndex != groupOrder.Count - 1) groupOrder[senderIndex + 1].Enabled = !isTextEmpty; 
} 
+0

它的工作原理,但讓我們假設我想使用textbox2並禁用1和3,我需要如果語句..我如何適應你的代碼到if聲明? – ExCluSiv3 2014-11-01 15:01:33

+0

更新了我的答案,可能有所幫助。 – WhoIsRich 2014-11-01 15:29:00

+0

再次更新,回顧我的回答,並意識到一個TextBox控件列表可能是一個更乾淨的解決方案。 – WhoIsRich 2014-11-06 19:23:04

1

使用Controls收集和一些LINQ

if (textBox1.Text.Trim().Length > 0) 
{ 
    var textboxes = this.Controls.OfType<TextBox>().Where(x => x.Name != "textBox1"); 
    foreach(var tBox in textboxes) 
     tBox.Enabled = false; 
} 
+0

謝謝,雖然你忘了添加tBox.Enabled = true;代碼在空的if語句上。 – ExCluSiv3 2014-11-01 14:48:58

+0

我用其他如果在textBox2上做同樣的事情(和textBox1和3將被禁用),它沒有工作,爲什麼? – ExCluSiv3 2014-11-01 14:54:35

+0

因爲條件'x.Name!=「textBox1」' – 2014-11-01 14:54:59

相關問題