2013-08-03 48 views
7

Tôi có biểu mẫu có tab control và mỗi tab có một số textboxes, labelsbuttons. Tôi muốn cho phép người dùng xóa tất cả văn bản trong hộp văn bản của tab đã chọn.Xóa văn bản của tất cả hộp văn bản trong tab đã chọn

Tôi đã thử

private void resetCurrentPageToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     foreach (TextBox t in tabControl1.SelectedTab.Controls) 
     { 
      t.Text = ""; 
     } 
    } 

Đoạn mã trên ném một InvalidCastException với tin nhắn Unable to cast object of type 'System.Windows.Forms.Button' to type 'System.Windows.Forms.TextBox.

Xin lỗi tôi đã làm gì sai và tôi có thể sửa nó như thế nào?

+1

Bạn muốn điều khiển.oftype () – Sayse

+0

@Sayse Pls nơi nào tôi đặt nó ?. Tôi sử dụng visual C# 2005 –

Trả lời

4

Tìm thấy trực tuyến này và nó làm việc

void ClearTextBoxes(Control parent) 
    { 
     foreach (Control child in parent.Controls) 
     { 
      TextBox textBox = child as TextBox; 
      if (textBox == null) 
       ClearTextBoxes(child); 
      else 
       textBox.Text = string.Empty; 
     } 
    } 

    private void resetCurrentPageToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     ClearTextBoxes(tabControl1.SelectedTab); 
    } 
5

Sử dụng OfType<T>() trong vòng lặp foreach.

private void resetCurrentPageToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    foreach (TextBox t in tabControl1.SelectedTab.Controls.OfType<TextBox>()) 
    { 
     t.Text = ""; 
    } 
} 

Alternative:

foreach (Control control in tabControl1.SelectedTab.Controls) 
{ 
    TextBox text = control as TextBox; 
    if (text != null) 
    { 
     text.Text = ""; 
    } 
} 
+0

Intellisence không hiển thị 'OfType ()'. Tôi sử dụng Visual C# 2005 –

+0

Nó có sẵn từ .NET 3.5 trở lên. Một lựa chọn khác là an toàn truyền nó vào một TextBox và kiểm tra nếu nó không null. Tôi sẽ thêm một ví dụ vào câu trả lời của tôi –

+0

Bạn cũng cần bao gồm không gian tên 'System.Linq'. –

1

Sử dụng chỉ có thể lặp qua tất cả các điều khiển trong tab chọn và trước khi thanh toán bù trừ việc kiểm tra văn bản nếu control typeTextBox và xóa văn bản.

foreach (Control item in tabControl1.SelectedTab.Controls) 
      { 
       if (item.GetType().Equals(typeof(TextBox))) 
       { 
        item.Text = string.Empty; 
       } 
      } 
+2

Câu lệnh if của bạn có thể được đơn giản hóa thành 'if (item là TextBox)' –

+0

@ScottChamberlain cảm ơn vì đã chỉ ra scott :) – Kurubaran

+0

Vẫn không thực hiện bất kỳ hành động nào –

1

nếu bạn có hộp văn bản được lồng trong tabcontrol. bạn cần phải viết một phương pháp đệ quy ở đây là phương pháp ofTypesẽ không trở lại textbox lồng nhau của bạn ..

private void ResetTextBoxes(Control cntrl) 
{ 
    foreach(Control c in cntrl.Controls) 
    { 
      ResetTextBoxes(c); 
      if(c is TextBox) 
      (c as TextBox).Text = string.Empty; 
    } 
} 

Hoặc nếu bạn đã có textbox chỉ vào mức độ cơ sở của TabControl bạn có thể sử dụng

foreach(var tb in tabControl1.OfType<TextBox>()) 
{ 
    tb.Text = string.Emtpy; 
} 
+0

Điểm tốt, nếu không có hộp văn bản này bên trong các điều khiển khác (bảng, hộp nhóm, vv) sẽ không bị xóa. –

+0

Tôi nhận được lỗi báo cáo 'foreach không thể hoạt động trên các biến loại' System.Windows.Forms.Control 'vì' System.Windows.Forms.Control 'không chứa định nghĩa công khai cho' GetEnumerator'' –

+0

foreach là một chút sai nó cần phải bo: foreach (Kiểm soát c trong cntrl.Controls) –

0
var textBoxNames = this.tabControl1.SelectedTab.Controls.OfType<TextBox>(); 
      foreach (var item in textBoxNames) 
      { 
       var textBoxes = tabControl1.SelectedTab.Controls.Find(item.Name, true); 
       foreach (TextBox textBox in textBoxes) 
       { 
        textBox.Clear(); 
       } 
      } 
Các vấn đề liên quan