具有单个构造函数的新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();
}
}
现在,我的问题是,调用第三种形式的两种形式是不同的——因此,我唯一想到的解决方法是复制一些代码并修改方法(你可以看到已经添加了第二个构造函数)。
没有多个构造函数和重复的方法(在这个类中,或者在一个单独的类中),有没有一种方法可以让我使用相同的构造函数,但根据调用它的形式使用不同的所有者?
您的子窗体中有太多的实现
将属性添加到您的子窗体:
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();
}
这个问题很难理解,但代码说明了一切。有两种选择,更糟糕(因为首先保留父引用不是一个好的做法):
-
创建一个类
taskWindow
和applianceWindow
(看在上帝的份上,这里是命名约定!)都实现的接口,例如表面IRefreshable{void refreshManuCombo();}
然后构造函数和您的poperty可以具有IRefreshable 类型
IRefreshable _owner;
public taskNewDropdownEntry(IRefreshable owner, int type)
{
InitializeComponent();
this._owner = owner;
}
- 更好的选择是,使用子窗体事件(如Closed)在父窗体中实现刷新逻辑。您只需要在显示表单和voila之前注册事件处理程序。请在此处查看示例:
https://msdn.microsoft.com/en-us/library/system.windows.forms.form.closed(v=vs.110).aspx
您还可以实现自己的公共表单事件,以实现更多的自定义用途(例如DataChanged、ResultGenerated)。