具有单个构造函数的新Winform的不同父级

本文关键字:Winform 单个 构造函数 | 更新日期: 2023-09-27 18:20:41

我遇到了一个关于孩子和父母的问题。

我有两个表单,它们有相同的下拉菜单,都可以为它们添加额外的选项。当在任何组合框中选择"(添加新选项)"选项时,将加载我的第三个表单,从而可以添加新选项。

这是第三个窗口的代码

 public partial class taskNewDropdownEntry : Form
{
    taskWindow _owner;
    applianceWindow _owner2;
    int windowType;
    int manufacturer_id;
    sqlMod data = new sqlMod();
    public int setManufacturerID {get { return manufacturer_id; } set { manufacturer_id = value; } }

    public taskNewDropdownEntry(taskWindow owner, int type)
    {
        InitializeComponent();
        this._owner = owner;
        this.windowType = type;
    }
    public taskNewDropdownEntry(applianceWindow owner, int type)
    {
        InitializeComponent();
        this._owner2 = owner;
        this.windowType = type;
    }
    private void taskNewDropdownEntry_Load(object sender, EventArgs e)
    {
        if (windowType == 1)
        {
            instructionLabel.Text = "Input the new appliance type below";
        }
        else if (windowType == 2)
        {
            instructionLabel.Text = "Input the new manufacturer below";
        }
        else if (windowType == 3)
        {
            instructionLabel.Text = "Input the new model below";
        }

    }
    private void btnOK_Click(object sender, EventArgs e)
    {
        if (windowType == 1)
        {
            data.insertApplianceType(textField.Text);
            _owner.refreshTypeCombo();
        }
        else if (windowType == 2)
        {
            data.insertManufacturerSimple(textField.Text);
            _owner.refreshManuCombo();
        }
        else if (windowType == 3)
        {
            data.insertModelSimple(manufacturer_id, textField.Text);
            _owner.refreshModelCombo();
        }
        this.Close();
    }
    private void btnCancel_Click(object sender, EventArgs e)
    {
        this.Close();
    }
}

现在,我的问题是,调用第三种形式的两种形式是不同的——因此,我唯一想到的解决方法是复制一些代码并修改方法(你可以看到已经添加了第二个构造函数)。

没有多个构造函数和重复的方法(在这个类中,或者在一个单独的类中),有没有一种方法可以让我使用相同的构造函数,但根据调用它的形式使用不同的所有者?

具有单个构造函数的新Winform的不同父级

您的子窗体中有太多的实现

将属性添加到您的子窗体:

public string InstructionLabel { get; set; }

这允许父窗体在实例化窗体时单独设置标签文本,并为窗体关闭时设置事件处理程序。所以你的家长表格会有类似的代码

var newItemForm = new taskNewDropdownEntry();
newItemForm.InstructionLabel = "Input the new appliance type below";
newItemForm.FormClosing += new FormClosingEventHandler(ChildFormClosing);

然后在孩子表单生命周期的早期某个地方(FormLoading事件)设置

instructionLabel.Text = InstructionLabel;

然后在的子窗体中添加一个属性

public string NewItem { get; set; }

您的子窗体应该在btnOK_Click事件中设置此公共属性

private void btnOK_Click(object sender, EventArgs e)
{
    this.NewItem =textField.Text;
}

然后,您的父窗体侦听FormClosing事件,当它命中该事件时,它会获取NewItem文本,将其添加到相关的组合框中并刷新它。因此,在父窗体中,处理程序看起来像

private void ChildFormClosing(object sender, FormClosingEventArgs e)
{
    sqlMod data = new sqlMod();
    data.insertApplianceType(textField.Text);
    refreshTypeCombo();
}

这个问题很难理解,但代码说明了一切。有两种选择,更糟糕(因为首先保留父引用不是一个好的做法):

  1. 创建一个类taskWindowapplianceWindow(看在上帝的份上,这里是命名约定!)都实现的接口,例如

    表面IRefreshable{void refreshManuCombo();}

然后构造函数和您的poperty可以具有IRefreshable 类型

IRefreshable _owner;
public taskNewDropdownEntry(IRefreshable owner, int type)
{
    InitializeComponent();
    this._owner = owner;
}
  1. 更好的选择是,使用子窗体事件(如Closed)在父窗体中实现刷新逻辑。您只需要在显示表单和voila之前注册事件处理程序。请在此处查看示例:

https://msdn.microsoft.com/en-us/library/system.windows.forms.form.closed(v=vs.110).aspx

您还可以实现自己的公共表单事件,以实现更多的自定义用途(例如DataChanged、ResultGenerated)。