2010-04-10 50 views
5

HTML có loại nút nhập để đặt lại tất cả các trường trong biểu mẫu về trạng thái ban đầu trong một bước: <input type="reset" ... />.Làm cách nào để xóa tất cả các trường biểu mẫu khỏi mã-đằng sau?

Có cách nào đơn giản tương tự để đặt lại tất cả các trường biểu mẫu của trang aspx từ mã sau không? Hoặc là cần thiết để đặt lại tất cả các điều khiển từng cái một với TextBox1.Text=string.Empty, TextBox2.Text=string.Empty, v.v ...?

Cảm ơn trước!

Cập nhật:

Bối cảnh là một Liên đơn giản/"Gửi cho chúng tôi một thông báo" trang với 8 asp: textbox trên trang (nơi người dùng nhập tên, địa chỉ, điện thoại, email, tin nhắn, vv .). Sau đó, anh ta nhấp vào gửi, trình xử lý tin nhắn Onclick trong mã sau sẽ gửi email tới một số quản trị viên và tất cả các trường biểu mẫu mà người dùng điền vào sẽ bị dọn sạch và anh ấy nhận được thông báo trong nhãn ("Message sent blabla ..."). Tôi muốn xóa các trường biểu mẫu để tránh người dùng nhấp lần nữa khi gửi và thông báo tương tự sẽ được gửi lần thứ hai.

+1

Tùy thuộc vào những gì kịch bản là, có thể có nhiều cách để xóa chúng. Bạn có thể giải thích làm thế nào bạn muốn điều này để làm việc trong kịch bản của bạn? –

+0

@Mikael Svenson: Tôi đã thêm "Cập nhật" vào câu hỏi của tôi để trả lời câu hỏi của bạn. Hy vọng điều này làm cho mọi thứ rõ ràng hơn. – Slauma

+0

Trong trường hợp đó, tôi đề xuất tắt chế độ xem cho các điều khiển bạn muốn xóa như tôi đã viết trong câu trả lời của tôi. –

Trả lời

11

Bạn chỉ cần viết một ngã ba cho mỗi loại điều khiển trừ khi một trong những điều khiển có điều gì đó đặc biệt cần phải được thực hiện để đặt lại.

foreach(var control in this.Controls) 
{ 
    var textbox = control as TextBox; 
    if (textbox != null) 
     textbox.Text = string.Empty; 

    var dropDownList = control as DropDownList; 
    if (dropDownList != null) 
     dropDownList.SelectedIndex = 0; 
    ... 
} 

BỔ SUNG Bạn hỏi làm thế nào để xóa điều khiển thậm chí những người được chôn. Để làm điều đó, bạn nên tạo một thói quen đệ quy như sau:

private void ClearControl(Control control) 
{ 
    var textbox = control as TextBox; 
    if (textbox != null) 
     textbox.Text = string.Empty; 

    var dropDownList = control as DropDownList; 
    if (dropDownList != null) 
     dropDownList.SelectedIndex = 0; 
    ... 

    foreach(Control childControl in control.Controls) 
    { 
     ClearControl(childControl); 
    } 
} 

Vì vậy, bạn sẽ gọi này bằng cách thông qua trang:

ClearControls(this); 
+0

Bạn có lẽ nên bao gồm một số đệ quy nếu bạn có databindings, điều khiển bên trong các mẫu và điều khiển tùy chỉnh. –

+0

Điều đơn giản tuyệt vời! (sẽ đặc biệt đơn giản trong trường hợp của tôi vì tôi chỉ có TextBox trên trang). Cảm ơn bạn! – Slauma

+0

Có một vấn đề: Hộp văn bản của tôi nằm bên trong phần tử 'Nội dung' cho một' ContentPlaceHolder' vì trang của tôi xuất phát từ một MasterPage. Bộ sưu tập 'this.Controls' này chỉ chứa một phần tử là chính MasterPage (hoặc một cái gì đó xuất phát từ nó) với' ID = ctl00'. Tôi đã tìm kiếm xung quanh trong trình gỡ lỗi nhưng không thể tìm thấy bất kỳ bộ sưu tập các đối tượng đại diện cho TextBoxes của tôi. – Slauma

1

Đối với kịch bản của bạn theo cách đơn giản nhất để xóa các lĩnh vực, trong ý kiến ​​của tôi, là tắt ViewState (EnableViewState=false) của các điều khiển bạn muốn để trống sau khi gửi.

Hoặc có thể cho toàn bộ trang trừ khi có một số trạng thái bạn cần.

+0

Hm, tôi vừa thử nghiệm nó (đối với một trong các TextBox và cũng là tùy chọn để tắt ViewState của toàn bộ trang). Nhưng nó không hoạt động: Tất cả các TextBox vẫn được điền sau khi postback. – Slauma

+0

Nếu bạn làm một postback thường xuyên (không phải ajax) với EnabledViewState = false trên trang hoặc một điều khiển, sẽ không có cách nào các trường đó nên có giá trị, trừ khi bạn đặt chúng trong mã ở đâu đó. –

+0

Tôi đã tạo một trang web thử nghiệm (một TextBox + một Button, EnableViewState = "false" ở cấp độ trang và cũng cho TextBox): Hành vi tương tự, Các giá trị trong TextBox được bảo toàn sau khi PostBack. Tôi đã googled một chút và tìm thấy giải thích: 1) http://www.dotnetfunda.com/articles/article760-common-misconception-regarding-viewstate-and-textbox-.aspx và 2) http://geekswithblogs.net /AaronLi/archive/2007/05/20/112615.aspx – Slauma

2

Sử dụng form.Controls.Clear() không phải là cách tiếp cận tốt vì nó sẽ xóa toàn bộ biểu mẫu và thậm chí bạn sẽ mất tất cả các nút trên biểu mẫu.

Thay vào đó nếu bạn chỉ muốn xóa tất cả các trường mẫu như các lĩnh vực văn bản và nút radio tôi sẽ khuyên bạn hãy thử như sau: Nếu bạn có một nút Reset “Button1”, sau đó nhấp chuột vào gọi một hàm reset();

trong chức năng thiết lập lại:

protected void resetButton_Click(object sender, EventArgs e) 
    { 
     TextBox1.Text=""; //set equal to empty string to all fields 
    } 

Hoặc chuyển hướng đến cùng một trang bằng cách chấm dứt các trang trước

protected void resetButton_Click(object sender, EventArgs e) 
    { 
     Response.Redirect("~/Test2.aspx", true); 
    } 
3

sử dụng phương pháp thủ công của String.Empty cho mỗi và mọi Hộp văn bản hoặc bất kỳ trường nào khác sẽ cồng kềnh, cũng bằng cách sử dụng Response.Redirect(); sẽ rất khó để hiển thị bất kỳ thông báo xác nhận nào hoặc giống nhau.Vì vậy, vào đọc rất nhiều blog tôi đã tìm được một phương pháp đáng tin cậy cho đến nay:

Public void reset(Control control) 
    { 
     foreach (Control x in control.Controls) 
     { 
     if (x is TextBox) 
     { 
      (x as TextBox).Text = String.Empty; 
     } 
     if (x is DropDownList) 
     { 
      (x as DropDownList).SelectedIndex = 0; 
     } 
     . 
     . 
     reset(x); 
     } 
    } 

sử dụng mã này như reset(this); trong trang của bạn bất cứ nơi nào bạn muốn đặt lại hoặc xóa các giá trị. Ở cuối điều kiện if, đừng quên sử dụng chức năng đệ quy sử dụng cùng một đối tượng Control x.

7

Tham khảo link này để biết thêm thông tin

http://www.freshcodehub.com/Article/3/clear-all-fields-like-textbox-dropdownlist-checkbox-radiobutton-label-after-form-submission-in-aspnet-c

public void ClearControls(Control parent) 
{ 
    foreach (Control c in parent.Controls) 
    { 
     if ((c.GetType() == typeof(TextBox))) //Clear TextBox 
     { 
      ((TextBox)(c)).Text = ""; 
     } 
     if ((c.GetType() == typeof(DropDownList))) //Clear DropDownList 
     { 
      ((DropDownList)(c)).ClearSelection(); 
     } 
     if ((c.GetType() == typeof(CheckBox))) //Clear CheckBox 
     { 
      ((CheckBox)(c)).Checked = false; 
     } 
     if ((c.GetType() == typeof(CheckBoxList))) //Clear CheckBoxList 
     { 
      ((CheckBoxList)(c)).ClearSelection(); 
     } 
     if ((c.GetType() == typeof(RadioButton))) //Clear RadioButton 
     { 
      ((RadioButton)(c)).Checked = false; 
     } 
     if ((c.GetType() == typeof(RadioButtonList))) //Clear RadioButtonList 
     { 
      ((RadioButtonList)(c)).ClearSelection(); 
     } 
     if ((c.GetType() == typeof(HiddenField))) //Clear HiddenField 
     { 
      ((HiddenField)(c)).Value = ""; 
     } 
     if ((c.GetType() == typeof(Label))) //Clear Label 
     { 
      ((Label)(c)).Text = ""; 
     } 
     if (c.HasControls()) 
     { 
      ClearControls(c); 
     } 
    } 
} 
Các vấn đề liên quan