2011-10-12 111 views
0

在我的應用程序中,我有一個85個文本框。在我的應用程序的所有文本框是這樣的:如何在C#中選中1複選框時清空所有文本框

void textBox1s(string input) 
{ 
    this.textBox1.ForeColor = Color.Black; 
    this.textBox1.Text = input; 
} 

private void textBox1_MouseClick(object sender, MouseEventArgs e) 
{ 
    textBox1s(Clipboard.GetText()); 
} 

,現在我想任何文本框時,複選框被通過TextBox1中僅>>>空textbox1.text 點擊/鼠標點擊檢查是否點擊TextBox2中僅>>>空TextBox2中的.text 和.....

,並在我的應用我有tabControl1和18組框

如何可以設置所有文本框時,複選框被選中爲空的點擊/鼠標點擊文本框上?

如果我的回答是使用用戶控件,請給我1個示例代碼

感謝。

+0

應用程序的示例屏幕截圖會有幫助。你需要清除複選框檢查/取消選中事件的文本框或只是文本框單擊事件 – reggie

+5

只是一些建議,如果你的應用程序有85個文本框,那麼你可能會做錯了什麼。 –

+0

@Ramhound我認爲他正在試圖建立一個GridView的自我 – Burimi

回答

0

neurotix正在朝着正確的軌道前進,但那不會在子容器中捕獲您的文本框,也不會處理調用正確的函數,以設置正確的文本框的屬性。在沒有用戶控件的情況下處理它的最好方法是使用遞歸函數來分配事件處理程序。

public void SetTextBoxClickHandler(Control control) 
{ 
    foreach (Control childControl in control.Controls) 
    { 
     if (childControl is TextBox) 
     { 
      childControl.Click += this.MyClickHandler; 
      continue; 
     } 
     if (item.Controls == null) 
      continue; 
     SetTextBoxClickHandler(childControl); 
    } 
} 

private void MyClickHandler(object sender, MouseEventArgs e) 
{ 
    typeof(Form).InvokeMember(string.Format("{0}s", ((Control)sender).Name), BindingFlags.InvokeMethod | BindingFlags.NonPublic, null, null, new object[] { Clipboard.GetText() }); 
} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    SetTextBoxClickHandler(this.Controls); 
} 

如果您使用用戶控件,那真的很簡單,只需從TextBox繼承,並將所有設置設置爲使用新控件。

public class ClickableTextBox : TextBox 
{ 
    public ClickableTextBox() 
    { 
     this.Click += MyClickHandler; 
    } 
    void setText(string input) 
    { 
     this.ForeColor = Color.Black; 
     this.Text = input; 
    } 

    private void MyClickHandler(object sender, MouseEventArgs e) 
    { 
     setText(Clipboard.GetText()); 
    } 
} 

我建議創建以下原因,客戶的用戶控件:

  1. 避免使用反射來調用一個方法動態地根據名字
  2. 的性能損失,避免轉換的性能損失在每次點擊時將對象發件人設置爲控件
  3. 避免在檢查每個控件的初始化循環期間以及窗體上的子控件(無論它是否爲TextBox)時性能降低
  4. 較少的代碼維護
  5. 如果您需要在不同的項目或不同的表單上重複使用,那麼表單代碼必須存在較高的可重用性,如果您需要在不同的項目或不同的表單上重複使用它,定製用戶控制,而不是將代碼複製/粘貼到每個可能需要更改的表單上

當然,如果您只需要設置文本,並且沒有其他功能,您可以簡化它bit ...

public void SetTextBoxClickHandler(Control control) 
{ 
    foreach (Control childControl in control.Controls) 
    { 
     if (childControl is TextBox) 
     { 
      childControl.Click += this.MyClickHandler; 
      continue; 
     } 
     if (item.Controls == null) 
      continue; 
     SetTextBoxClickHandler(childControl); 
    } 
} 

private void MyClickHandler(object sender, MouseEventArgs e) 
{ 
    TextBox textBox = sender as Textbox; 
    if (textBox == null) 
     return; 
    textBox.ForeColor = Color.Black; 
    textBox.Text = Clipboard.GetText(); 
} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    SetTextBoxClickHandler(this.Controls); 
} 

或使用用戶控件:

public class ClickableTextBox : TextBox 
{ 
    public ClickableTextBox() 
    { 
     this.Click += MyClickHandler; 
    } 

    private void MyClickHandler(object sender, MouseEventArgs e) 
    { 
     this.ForeColor = Color.Black; 
     this.Text = input; 
    } 
} 

由於上述原因,我仍然建議使用自定義用戶控件。

0

從我可以確定的情況來看,您希望複選框充當切換 - 當它被選中時,刪除文本框的內容,當它未被選中時,將剪貼板複製到其中。

該代碼將是:

void textBox_MouseClick(object sender, MouseEventArgs e) 
{ 
    textBox tb = (TextBox)sender; 
    if (checkBox1.IsChecked) 
    { 
     tb.Text = ""; 
    } 
    else 
    { 
     tb.Text = Clipboard.GetText(); 
    } 
} 

然後,你可以讓所有的請點擊()事件的文本框指向這一個方法 - 萬歲代碼複用:d

+0

所有85文本框使用此代碼? 85文本框。我需要1代碼的所有文本框這段代碼對我沒有用處: - ? – Mehrdad

+0

不,您可以將所有文本框設置爲使用這一段代碼。轉到您正在處理的表單中>單擊文本框,查看左側的屬性窗口,轉到事件選項卡,找到MouseClick()事件並將該字段中的文本替換爲textBox_MouseClick。是的,您必須爲所有85個文本框執行此操作,但您只需要執行一次。無論是將上面的代碼粘貼到當前的所有事件處理程序中(我假設其中也有85個)。 –

+0

編號如果單擊任何文本框剪貼板只複製到tb.Text :) – Mehrdad

1

重置Text下面的代碼這部分將復位該被點擊的任何文本框:

首先聲明事件委託

private void AllTextBoxes_MouseClick(object sender, MouseEventArgs e) 
     { 
      if(sender is TextBox) 
       ((TextBox)(sender)).Text = ""; 
     } 

比這個分配給每個文本框,您可以使用VisualStudio的屬性框要做到這一點,通過選擇所有的文本框,並分配或做manualy的foreach一個:

this.textBox2.MouseClick += new System.Windows.Forms.MouseEventHandler(this.AllTextBoxes_MouseClick); 

或FormLoad_Event你可以做到這一點

foreach (Control ctrl in this.Controls) 
      { 
       if (ctrl is TextBox) 
       { 
        ctrl.MouseClick += new System.Windows.Forms.MouseEventHandler(this.AllTextBoxes_MouseClick); 
       } 
      } 

,你可以在組框之內復位文本框的文字這樣

foreach (Control ctrl in groupBox1.Controls) 
      { 
       if (ctrl is TextBox) 
       { 
        MessageBox.Show(ctrl.Name); 
       } 
      } 

你都可以GroupBoxes:

foreach (Control control in this.Controls) 

    { 
     if(control is GroupBox) 
     { 
     foreach (Control ctrl in groupBox1.Controls) 
        { 
         if (ctrl is TextBox) 
         { 
          MessageBox.Show(ctrl.Name); 
         } 
        } 
     } 
    { 
+0

不錯,但我認爲這個代碼不適用於groupbox中的任何文本框。和至少60個文本框在groupbox :( – Mehrdad

+0

@Mehrdad你爲什麼這麼認爲呢? – Burimi

+0

哇很好的工作:)並且可以幫助我如何爲所有gropbox設置它?謝謝 – Mehrdad

1

不exackly知道你的意思做,但如果你想通過文本框的集合進行迭代,你可以做到這一點是這樣的:

foreach (Control cntrl in this.Controls) 
    { 
     if (cntrl is TextBox) 
     { 
      cntrl.Text = "lold"; 
     } 
    } 

其中「這」狀容器

相關問題