2016-12-14 4 views
0

Я пытаюсь создать глобальный класс Reset, который сбросит все значения в форме и вызывается начальным методом этой формы. Я динамически передаю имя формы в класс Reset и сброшу все значение элемента управления и назвал метод этой формы. Вот мой код ...

Сброс КлассКак назначить какое-либо значение элементу управления посредством вызова метода из другого класса в C#

class Reset 
{ 
    public void BlankAll(string FormName, Panel pnl, string UserName) 
    {   
     foreach (Control ch in pnl.Controls)  // this foreach loop reset the values of each control, it's working fine. So don't bother about it. 
     { 
      if (ch.Name.Substring(ch.Name.Length - 3) != "_NI") 
      { 
       if (ch is TextBox || ch is ComboBox) 
        ch.Text = string.Empty; 
       else if (ch is DateTimePicker) 
        ch.Text = DateTime.Now.ToShortDateString(); 
       else if (ch is DataGridView) 
       {       
        DataGridView dgv = (DataGridView)pnl.Controls.Find(ch.Name, true).SingleOrDefault(); 
        for (int i = dgv.Rows.Count - 1; i > 0; i--) 
        { 
         dgv.Rows.RemoveAt(i); 
        } 
        for (int i = 1; i < dgv.Columns.Count; i++) 
        { 
         dgv.Rows[0].Cells[i].Value = string.Empty; 
        } 

       } 
      } 
     }    

     Type tp = Type.GetType("HealthClub." + FormName);  // HealthClub is NameSpace 
     object myobj = Activator.CreateInstance(tp); 
     MethodInfo method = myobj.GetType().GetMethod("FillValues"); // FillValues is the method which I am trying to call 
     object[] parametersArray = new object[] { UserName }; 
     method.Invoke(myobj, parametersArray);  

    } 
} 

Вот FillValues метод в Form1, который я хочу Invoke из Reset класса

public void FillValues(string UserName) 
{ 
    DataTable DT; 
    SqlCommand cmd = new SqlCommand(); 
    try 
    { 
     cmd.Connection = Connections.Connection[UserName]; 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.CommandText = "TrainerMaster_pro"; 
     cmd.Parameters.AddWithValue("Option", "FillValues".Trim()); 
     if (Connections.Connection[UserName].State == ConnectionState.Closed) 
      Connections.Connection[UserName].Open(); 
     SqlDataAdapter adp = new SqlDataAdapter(cmd); 
     DT = new DataTable(); 
     adp.Fill(DT);     
     lblId___.Text = DT.Rows[0][0].ToString(); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.ToString()); 
    } 
    finally 
    { 
     cmd.Parameters.Clear(); 
     cmd.Dispose(); 
     Connections.Connection[UserName].Close();     
    } 
} 

Теперь я пытаюсь сбросить Form1 из Form2 через Reset класс. Так что я делаю это в Form2

private void btnReset_Click(object sender, EventArgs e) 
{ 
    Reset RS = new Reset(); 
    RS.BlankAll("Form1", pnl, UserName); 
} 

Все работает отлично и метод FillValues Invoke успешно, но основная проблема заключается значение базы данных не приписывая lblId___ в FillValues метода. Я это понимаю, потому что в моем классе Reset я создаю новый объект для формы, которую я передаю. Некоторые люди предлагают мне использовать метод Invoke, используя по ссылке.

Как это можно сделать?

Пожалуйста, помогите ребята ....

ответ

0

В BlankAll вы передаете имя формы, самой формы. так что ваша подпись должна выглядеть следующим образом

class Reset 
{ 
    public void BlankAll(Form form, Panel pnl, string UserName) 
    {   
     foreach (Control ch in pnl.Controls) 
     { 
      if (ch.Name.Substring(ch.Name.Length - 3) != "_NI") 
      { 
       if (ch is TextBox || ch is ComboBox) 
        ch.Text = string.Empty; 
       else if (ch is DateTimePicker) 
        ch.Text = DateTime.Now.ToShortDateString(); 
       else if (ch is DataGridView) 
       {       
        DataGridView dgv = (DataGridView)pnl.Controls.Find(ch.Name, true).SingleOrDefault(); 
        for (int i = dgv.Rows.Count - 1; i > 0; i--) 
        { 
         dgv.Rows.RemoveAt(i); 
        } 
        for (int i = 1; i < dgv.Columns.Count; i++) 
        { 
         dgv.Rows[0].Cells[i].Value = string.Empty; 
        } 
       } 
      } 

    Type tp = Type.GetType("HealthClub." + form.Name); 
    object myobj = Activator.CreateInstance(tp); 
    MethodInfo method = myobj.GetType().GetMethod("FillValues"); 
    object[] parametersArray = new object[] {form, UserName }; 
    form.Refresh(); 
     }    

при вызове заливка вы должны передать форму, так что метод будет знать «что» метка должна обновить

public void FillValues(Form form, string UserName) 
{ 
    DataTable DT; 
    SqlCommand cmd = new SqlCommand(); 
    try 
    { 
     cmd.Connection = Connections.Connection[UserName]; 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.CommandText = "TrainerMaster_pro"; 
     cmd.Parameters.AddWithValue("Option", "FillValues".Trim()); 
     if (Connections.Connection[UserName].State == ConnectionState.Closed) 
      Connections.Connection[UserName].Open(); 
     SqlDataAdapter adp = new SqlDataAdapter(cmd); 
     DT = new DataTable(); 
     adp.Fill(DT);     
     form.lblId___.Text = DT.Rows[0][0].ToString(); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.ToString()); 
    } 
    finally 
    { 
     cmd.Parameters.Clear(); 
     cmd.Dispose(); 
     Connections.Connection[UserName].Close();     
    } 
} 
+0

@ShaiwalTripathi BlankAll Метод в вашей форме? , тогда вы должны выглядеть так: BlankAll (это, panel1, "admin"); – BMaximus

+0

'FillValues' метод не возвращает никакого значения, так зачем использовать SomeDatacontainer? –

+0

@ShaiwalTripathi передает форму в качестве аргумента. – BMaximus

0

Shaiwal вы можете добиться этого двумя способами.

1) Передайте форму как ссылку, скорее передав имя формы, и вызовите метод intial.

2) Вы можете использовать делегат для передачи метода и метода вызова после выполнения вашей работы.

0

На самом деле, когда вы создаете экземпляр класса сброса вы можете передать ссылку формы, используя это ключевое слово в качестве параметра в конструкторе, чтобы не требовалось создавать новый экземпляр формы.

Вы можете сделать что-то вроде ниже

Reset RS = new Reset(this); 

Сделать конструктор параметров в классе Reset, который принимает это, как показано ниже

Public Reset(Form currentForm) 
{ 
    //set the form variable or property here as per your requirement 
} 
+0

Привет @Nikunj 'FillValues' находится в' Form1', и я вызываю метод 'BlankAll' из' Form2', то почему я передам ссылку 'Form2'? –

+0

@ShaiwalTripathi Да! – BMaximus