如何通过C#中另一个类的方法调用为控件分配一些值



我正在尝试制作一个全局的Reset类,该类别以形式重置所有值并称为该表单的初始方法。我将表单名称动态传递到Reset类并重置所有控件的值,并称为该表单的方法。这是我的代码...

重置类

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);    
    }
}

这是Form1中的FillValues方法,我想从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();                
    }
}

现在,我试图从Form2重置Form1Reset类。所以我在Form2

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

一切都很好,方法FillValues成功调用,但主要问题是数据库值未分配给FillValues方法中的LBLID___。我理解这一点,因为在我的Reset类中,我正在为我通过的形式创建新对象。有人建议我使用通过参考调用方法。

如何做?

请帮助男人....

在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();                
     }
}

shaiwal您可以通过两种方式实现这一目标。

1)通过表格作为参考,而不是传递表单名称并调用Intial方法。

2)您可以在执行工作后使用委托通过方法参考并调用方法。

实际上在创建重置类实例时,可以使用此关键字作为构造函数中的参数传递表单的引用,这样您就不需要创建新实例形式。

您可以做以下

之类的事情
Reset RS = new Reset(this);

在重置类中制作一个参数构造函数,该构造函数像下面一样接受

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

最新更新