我正在尝试制作一个全局的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
重置Form1
到Reset
类。所以我在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
}