如何使用windows窗体使用同一事件的多个窗体

本文关键字:窗体 事件 何使用 windows | 更新日期: 2023-09-27 18:26:26

我在SO pt上问了同样的问题,但似乎没有人理解这个问题,尽管我说得很清楚。

我有一张表格,我将用于

  1. 在数据库中注册客户
  2. 更改任何寄存器
  3. 显示寄存器

我在这里实例化这个表单:

private void mnuRegister_Click(object sender, EventArgs e)
{
    var frmRegister = new frmRegisterScreen();
    frmRegister.Show();
}

正如您所看到的,我从一个名为mnuRegisterToolStripMenuItem中调用该表单。

现在,我正在Load`事件中自定义该表单中的许多属性,这将使其更适合注册客户。

以下是代码:

private void frmRegisterScreen_Load(object sender, EventArgs e)
{
    //set the database connection and the Sql command to be used
    string conString = "Server = .''sqlexpress; trusted_connection = yes; database=he_dados;";
    SqlConnection con = new SqlConnection(conString);
    string sel = "SET DATEFORMAT dmy;'n" //set date format to dd//mm/yyyy
                        + "Insert into Customer(" +
                         "Name,IDCard,Phone,Address,Observation)" +
                         "values(" +
                         "'" + txtName.Text +
                         "','" + mskIDCard.Text +
                         "','" + mskPhone.Text +
                         "','" + txtAddress.Text +
                         "','" + txtObs.Text + "');";    
    SqlCommand selCmd = new SqlCommand(sel, con);
    //set the form properties relate to the customer registration
    lblMain.Text = "Register Customer";
    tsbSave.Text = "Save Changes";
}

正如您所看到的,这段代码显然是为了在表中插入数据。

现在,我想做的是调用这种形式的另一个实例:

private void mnuViewRegister_Click(object sender, EventArgs e)
{
    var frmViewRegister = new frmRegisterScreen();
    frmViewRegister.Show();
}

然后我想设置特定的属性,这是我使用相同表单进行简单查询所必需的,例如:

private void frmRegisterScreen_Load(object sender, EventArgs e)
{
    //set the database connection and the Sql command to be used
    string conString = "Server = .''sqlexpress; trusted_connection = yes; database=he_dados;";
    SqlConnection con = new SqlConnection(conString);
    string sel = "Select * from Customer;";    
    SqlCommand selCmd = new SqlCommand(sel, con);
    //set the form properties relate to the customer registration
    lblMain.Text = "View Customer Registers";
    tsbSave.Text = "View";
}

换句话说,我希望有特定于表单实例的事件调用,而不是有一个对任何实例都有效的事件。

这可能吗?

如何使用windows窗体使用同一事件的多个窗体

如果您发现自己配置了大量的UI元素,那么只需创建单独的Forms。它们不会花你任何钱,而且更容易维护。但看起来你只更改了几个UI元素(比如标签),所以这还不错。

将配置逻辑移动到Form上的两个独立方法中,如ConfigureForRegistrationConfigureForViewingRegistration,然后在实例化Form时调用适当的方法:

var frmRegister = new frmRegisterScreen();
frmRegister.ConfigureForRegistration();
frmRegister.Show();

或者,您可以为每个可能的视图创建一个枚举,并在实例化Form:时传入一个值

public enum ScreenOption
{
    Register,
    AlterRegister,
    ViewRegister
}
public class frmRegisterScreen
{
    public frmRegisterScreen(ScreenOption option)
    {
        switch (option)
        {
            case ScreenOption.ViewRegister:
                //set the database connection and the Sql command to be used
                string conString = "Server = .''sqlexpress; trusted_connection = yes; database=he_dados;";
                SqlConnection con = new SqlConnection(conString);
                break;
            ...
        }
    }
}
var frmRegister = new frmRegisterScreen(ScreenOption.ViewRegister);
frmRegister.Show();