初始化后对象丢失数据

时间:2014-11-20 12:56:47

标签: c# winforms

我的项目中有这些对象:

  • SchedulerList
  • SchedulerListItem
  • SchedulerListItemDetails

每个都是一个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);
    }
}

2 个答案:

答案 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);
    }
}

现在感觉有点傻:)。