我的项目中有这些对象:
每个都是一个win form控件,用于我的应用程序的形式。 SchedulerList包含SchedulerListItems,每个项目都可以包含SchedulerListItemDetails。
我的代码如下:
//creating my initial list form
FrmListTesting f = new FrmListTesting();
f.Show();
表单只有一个按钮,它有一个用于测试目的的硬编码参数,以及一个SchedulerList控件,它将保存列表项。
单击该按钮时,表单执行以下操作:
private void button1_Click(object sender, EventArgs e)
{
var control = this.Controls[1] as SchedulerList;
var path = @"D:\Share\Countries.txt";
var sli = new SchedulerListItem(path);
control.AddItem(sli);
}
我的SchedulerListItem构造如下:
public SchedulerListItem(string path)
{
InitializeComponent();
this.Name = Path.GetFileNameWithoutExtension(path);
this.SourcePath = path;
this.DestinationPath = GetDestinationPath(path);
}
AddItem方法定义为:
public void AddItem(SchedulerListItem item)
{
this.flPanel.Controls.Add(item);
}
添加项目方法按预期工作,显示所需的所有数据并在UI中显示。列表项有一个按钮,可以显示详细信息表单:
//the form constructor
public FrmSchedulerItemDetails(SchedulerListItem item)
{
InitializeComponent();
this.detailsControl = new SchedulerListItemDetails(item, this);
}
//control constructor
public SchedulerListItemDetails(SchedulerListItem item, Form owner)
{
InitializeComponent();
this.SourcePath = item.SourcePath;
this.DestinationPath = item.DestinationPath;
this.OldFormat = item.OldFormat;
this.ExportToExcel = item.ExportToExcel;
this.owner = owner;
this.underlyingItem = item;
}
现在问题。在调用SchedulerListItemDetails构造函数并且数据"被初始化"之后,当我查看对象内部的数据时,它设置为默认值。它会在InitializeComponent();
之后设置的所有内容都被忽略。
我尝试过的事情:
InitializeComponent()
方法上设置断点,以查看与设置为默认值相关联的堆栈跟踪这些方法都没有显示任何结果......我知道如果我直接使用表格而不是使用from中的控件我可以按照我想要的方式设置值,但我非常困惑为什么这个控制的其他方法不起作用。
编辑1:
SchedulerListItemDetails的代码:
public partial class SchedulerListItemDetails : UserControl
{
public SchedulerListItemDetails(SchedulerListItem item, Form owner)
{
InitializeComponent();
this.SourcePath = item.SourcePath;
this.DestinationPath = item.DestinationPath;
this.OldFormat = item.OldFormat;
this.ExportToExcel = item.ExportToExcel;
this.owner = owner;
this.underlyingItem = item;
}
public SchedulerListItemDetails()
{
InitializeComponent();
}
private Form owner = null;
private SchedulerListItem underlyingItem;
public Boolean ExportToExcel
{
get
{
return this.cbxExcel.Checked;
}
set
{
this.cbxExcel.Checked = value;
}
}
public Boolean OldFormat
{
get
{
return this.cbxOldFormat.Checked;
}
set
{
this.cbxOldFormat.Checked = value;
}
}
public String DestinationPath
{
get
{
return this.tbxDestinationPath.Text;
}
set
{
this.tbxDestinationPath.Text = value;
}
}
public String SourcePath
{
get
{
return this.tbxSourcePath.Text;
}
set
{
this.tbxSourcePath.Text = value;
}
}
private void btnCancel_Click(object sender, EventArgs e)
{
this.owner.Close();
}
private void btnSave_Click(object sender, EventArgs e)
{
underlyingItem.SourcePath = this.SourcePath;
underlyingItem.DestinationPath = this.DestinationPath;
underlyingItem.OldFormat = this.OldFormat;
underlyingItem.ExportToExcel = this.ExportToExcel;
btnCancel_Click(sender, e);
}
}
答案 0 :(得分:0)
我会回答,因为它可以帮助您解决问题。
你有默认的(无参数)构造函数,可能被称为,如果它被调用,那么参数的构造函数不会被称为。
正确的设计就像是
public partial class SchedulerListItemDetails : UserControl
{
public SchedulerListItemDetails()
{
InitializeComponent();
}
public SchedulerListItemDetails(SchedulerListItem item, Form owner): this()
{
this.SourcePath = item.SourcePath;
...
}
}
注意this()
,这确保了之前调用的无参数构造函数(以及InitializeComponent()
,也不需要在另一个构造函数中复制它。)
回到你的问题。在你的情况下,它就像这样
public partial class SchedulerListItemDetails : UserControl
{
public SchedulerListItemDetails()
{
InitializeComponent();
}
public SchedulerListItemDetails(SchedulerListItem item, Form owner)
{
InitializeComponent();
this.SourcePath = item.SourcePath;
...
}
}
只能调用一个构造函数。因此,如果你将断点放在无参数的触发器中,那么你就会遇到问题。因为您在不设置其属性的情况下创建SchedulerListItemDetails
某处(它们保持默认值)。
更可能的问题是你创建了该对象的new
实例(在构造正确之前或之后,如果你的代码构造了这样的对象)并且该实例是你稍后检查的。
答案 1 :(得分:0)
因此,在我快速了解胜利形式如何运作之后,我发现了问题所在。
我认为足够的代码是:
public FrmSchedulerItemDetails(SchedulerListItem item)
{
InitializeComponent();
this.DetailsControl = new SchedulerListItemDetails(item, this);
}
public SchedulerListItemDetails DetailsControl
{
get
{
return this.detailsControl;
}
set
{
this.detailsControl = value;
}
}
this.detailsControl是我试图设置的控件,但是我已经学会了为新组件替换组件的正确方法:
public FrmSchedulerItemDetails(SchedulerListItem item)
{
InitializeComponent();
this.DetailsControl = new SchedulerListItemDetails(item, this);
}
public SchedulerListItemDetails DetailsControl
{
get
{
return this.detailsControl;
}
set
{
this.Controls.Remove(this.detailsControl);
this.detailsControl = value;
this.Controls.Add(this.detailsControl);
}
}
现在感觉有点傻:)。