2013-03-22 3 views
4

Мне было интересно, есть ли способ сбросить все флажки, текстовые поля, числовые и другие элементы управления до значений по умолчанию, не записывая код для каждого элемента управления отдельно? Это код, который я пытался, но не похоже на работу:Сбросить все элементы в форме

for (int i = 0; i < this.Controls.Count; i++) 
{ 
    this.Controls[i].ResetText(); 
} 

EDIT:
Я установил его, установив вручную контрольные значения, извини за все неприятности>. <.

+0

Я предполагаю, так как вы просто зацикливание на верхний уровень управления, вы должны рекурсивно проверить для элементов управления и сделать 'ResetText()' (так что если у вас есть текстовое поле, флажок говорят в панели затем это не проверяет элементы управления внутри панели) – V4Vendetta

+0

@ V4Vendetta Я вижу, есть ли способ сделать это возможным? Или мне нужно проверить все панели и другие контейнеры? –

+0

Да, это возможно. См. Мой ответ. – ispiro

ответ

11

ли ниже создать класс и назовите его как этот

Проверил: Reset all Controls (Textbox, ComboBox, CheckBox, ListBox) in a Windows Form using C#

private void button1_Click(object sender, EventArgs e) 
{ 
    Utilities.ResetAllControls(this); 
} 

public class Utilities 
    { 
     public static void ResetAllControls(Control form) 
     { 
      foreach (Control control in form.Controls) 
      { 
       if (control is TextBox) 
       { 
        TextBox textBox = (TextBox)control; 
        textBox.Text = null; 
       } 

       if (control is ComboBox) 
       { 
        ComboBox comboBox = (ComboBox)control; 
        if (comboBox.Items.Count > 0) 
         comboBox.SelectedIndex = 0; 
       } 

       if (control is CheckBox) 
       { 
        CheckBox checkBox = (CheckBox)control; 
        checkBox.Checked = false; 
       } 

       if (control is ListBox) 
       { 
        ListBox listBox = (ListBox)control; 
        listBox.ClearSelected(); 
       } 
      } 
     }  
    } 
+0

Это, похоже, не работает, потому что мои объекты находятся в 'TabControl'? –

+0

@FoxyShadoww Я думаю, вам придется перебирать «TabPages», а затем – V4Vendetta

+0

+1 2 года, и это отлично сработало для меня. Я удалил 'foreach' внутри метода и вступил в декларацию, поэтому мне не нужно быть особенным в Control. 'foreach (Control ctrl in grp1.Controls) { Utilities.ResetAllControls (ctrl); } ' –

0

Вы можете сбросить все элементы управления определенного типа. Что-то вроде

foreach(TextBox tb in this.Controls.OfType<TextBox>().ToArray()) 
{ 
    tb.Clear(); 
} 

Но вы не можете сбросить все элементы управления сразу

0

Быстрый ответ, может быть, это поможет:

private void button1_Click(object sender, EventArgs e) 
{    
    Form2 f2 = new Form2(); 
    f2.ShowDialog(); 
    while (f2.DialogResult == DialogResult.Retry) 
    { 
     f2 = new Form2(); 
     f2.ShowDialog(); 
    } 
} 

и в Form2 (форма 'Настройки'):

private void button1_Click(object sender, EventArgs e) 
{ 
    DialogResult = DialogResult.OK; 
    Close(); 
} 

private void button2_Click(object sender, EventArgs e) 
{ 
    DialogResult = DialogResult.Retry; 
    Close(); 
} 
+0

Но это перезапускает форму, не так ли? Настройки загружаются при запуске формы, поэтому я не совсем уверен, что это сработает :( –

+0

@FoxyShadoww Я не понимаю. Да, он перезапустит форму. Разве это не то, что вы хотите? Если параметры загружаются в конструктор - они также будут для нового экземпляра.) – ispiro

+0

Окай, я собираюсь попробовать, но настройки загружаются из внешнего XML-файла. EDIT: Да, это похоже, не работает для меня по какой-то причине ... –

0

недавно я должен был сделать это для Textboxes и Флажки, но с использованием JavaScript ...

How to reset textbox and checkbox controls in an ASP.net document

Вот код ...

<script src="http://code.jquery.com/jquery-1.7.1.js" type="text/javascript"></script> 

<script type="text/javascript"> 
     function ResetForm() { 
      //get the all the Input type elements in the document 
      var AllInputsElements = document.getElementsByTagName('input'); 
      var TotalInputs = AllInputsElements.length; 

      //we have to find the checkboxes and uncheck them 
      //note: <asp:checkbox renders to <input type="checkbox" after compiling, which is why we use 'input' above 
      for(var i=0;i< TotalInputs ; i++) 
      { 
      if(AllInputsElements[i].type =='checkbox') 
      { 
       AllInputsElements[i].checked = false; 
      } 
      } 

      //reset all textbox controls 
      $('input[type=text], textarea').val(''); 

      Page_ClientValidateReset(); 
      return false; 
     } 

     //This function resets all the validation controls so that they don't "fire" up 
     //during a post-back. 
     function Page_ClientValidateReset() { 
      if (typeof (Page_Validators) != "undefined") { 
       for (var i = 0; i < Page_Validators.length; i++) { 
        var validator = Page_Validators[i]; 
        validator.isvalid = true; 
        ValidatorUpdateDisplay(validator); 
       } 
      } 
     } 
</script> 

И называть его с помощью кнопки или любым другим способом ...

<asp:button id="btnRESET" runat="server" onclientclick="return ResetForm();" text="RESET" width="100px"></asp:button> 

Если вы не используете ValidationControls на вашем веб-сайте, просто удалите весь код, относящийся к нему выше, и звонок Page_ClientValidateReset();

Я уверен, что вы можете расширить его для любого другого элемента управления, используя DOM. И поскольку на сервер нет сообщений, это быстрее и не «мигает».

1

Дополнительный-> Очистить дочерние элементы управления Функция ниже очищает вложенные (дочерние) элементы управления и завершает работу в классе.

public static void ClearControl(Control control) 
     { 
      if (control is TextBox) 
      { 
       TextBox txtbox = (TextBox)control; 
       txtbox.Text = string.Empty; 
      } 
      else if (control is CheckBox) 
      { 
       CheckBox chkbox = (CheckBox)control; 
       chkbox.Checked = false; 
      } 
      else if (control is RadioButton) 
      { 
       RadioButton rdbtn = (RadioButton)control; 
       rdbtn.Checked = false; 
      } 
      else if (control is DateTimePicker) 
      { 
       DateTimePicker dtp = (DateTimePicker)control; 
       dtp.Value = DateTime.Now; 
      } 
      else if (control is ComboBox) 
      { 
       ComboBox cmb = (ComboBox)control; 
       if (cmb.DataSource != null) 
       { 
        cmb.SelectedItem = string.Empty; 
        cmb.SelectedValue = 0; 
       } 
      } 
      ClearErrors(control); 
      // repeat for combobox, listbox, checkbox and any other controls you want to clear 
      if (control.HasChildren) 
      { 
       foreach (Control child in control.Controls) 
       { 
        ClearControl(child); 
       } 
      } 


     } 
0
function setToggleInputsinPnl(pnlName) { 
    var domCount = pnlName.length; 
    for (var i = 0; i < domCount; i++) { 
     if (pnlName[i].type == 'text') { 
      pnlName[i].value = ''; 
     } else if (pnlName[i].type == 'select-one') { 
       pnlName[i].value = ''; 
     } 
    } 
} 
2

Вы можете создать форму снова и утилизировать старую.

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void btnReset_Click(object sender, EventArgs e) 
    { 
     Form1 NewForm = new Form1();   
     NewForm.Show(); 
     this.Dispose(false); 
    } 
} 
+0

Я знаю, что эта ветка устарела, но есть ли какая-то причина, по которой я не должен этого делать? Кажется, что это намного проще, чем любой другой ответы. – VinnyGuitara

3
foreach (Control field in container.Controls) 
      { 
       if (field is TextBox) 
        ((TextBox)field).Clear(); 
       else if (field is ComboBox) 
        ((ComboBox)field).SelectedIndex=0; 
       else 
        dgView.DataSource = null; 
        ClearAllText(field); 
      } 
0

Если у вас есть несколько панелей или рамок группы сброс поле должно быть рекурсивным.

public class Utilities 
{ 
    public static void ResetAllControls(Control form) 
    { 
     foreach (Control control in form.Controls) 
     { 
      RecursiveResetForm(control); 
     } 
    } 

    private void RecursiveResetForm(Control control) 
    {    
     if (control.HasChildren) 
     { 
      foreach (Control subControl in control.Controls) 
      { 
       RecursiveResetForm(subControl); 
      } 
     } 
     switch (control.GetType().Name) 
     { 
      case "TextBox": 
       TextBox textBox = (TextBox)control; 
       textBox.Text = null; 
       break; 

      case "ComboBox": 
       ComboBox comboBox = (ComboBox)control; 
       if (comboBox.Items.Count > 0) 
        comboBox.SelectedIndex = 0; 
       break; 

      case "CheckBox": 
       CheckBox checkBox = (CheckBox)control; 
       checkBox.Checked = false; 
       break; 

      case "ListBox": 
       ListBox listBox = (ListBox)control; 
       listBox.ClearSelected(); 
       break; 

      case "NumericUpDown": 
       NumericUpDown numericUpDown = (NumericUpDown)control; 
       numericUpDown.Value = 0; 
       break; 
     } 
    }   
} 
Смежные вопросы