擦除绑定到Winforms表单的对象的所有属性值?

时间:2010-04-05 20:57:22

标签: c# winforms properties

在C#Winforms(3.5)应用程序中,我添加了一个类,其中包含许多属性(get / set),用于存储来自12个表单长的进程的值。

在表单12之后,我想清除存储类中的所有属性值,以便下一个用户在表单1启动进程时不会意外记录值。

是否可以擦除/销毁/处置类中的所有属性值?

我的班级看起来像这样:

private static int battery;
public int Battery
{
    get { return storeInspectionValues.battery; }
    set { storeInspectionValues.battery = value; }
}

5 个答案:

答案 0 :(得分:16)

您可以创建该类的新实例吗?你将得到完全相同的对象。

编辑以回应评论

让我们说这是你的班级:

public class Foo
{
    private int _battery;
    private string _someOtherValue;

    public int Battery
    {
        get { return _battery; }
        set { _battery = value; }
    }

    public string SomeOtherValue
    {
        get { return _someOtherValue; }
        set { _someOtherValue = value; }
    }
}

您说您要“擦除/销毁/处置类中的所有属性值”。我认为这意味着您要将所有属性重置为其默认值。这意味着这样的事情:

foo.Battery = 0;
foo.SomeOtherValue = null;

这样做可以做到这一点:

foo = new Foo();

现在foo是一个实例,其属性都有默认值。这会解决你的问题吗?

答案 1 :(得分:3)

如果创建新实例不是一个好选择,您可以实现一个方法,为值参数和新实例分配默认值以引用参数。

答案 2 :(得分:1)

没有内置机制来“重置”类的所有属性的值。虽然有一些方法可以实现这一点,既可以直接(创建一个明确重置所有属性值的方法)而不是直接(使用Reflection来查找所有属性并设置它们的值),我不建议任何这些听听你想要完成的事情。

如果您的用户界面正在捕获数据,在某处提交该数据,然后将其丢弃,那么很可能您只想创建对象的新实例,而不是尝试清除它。

我在你的例子中注意到你的属性有一个静态的支持变量。除非你有特殊的理由这样做,否则你应该使你的变量非静态,否则创建一个对象的新实例将不会真正具有你想要的效果(阅读静态和非静态变量之间的差异如果这对你没有意义的话。)

添加以下代码示例以回应评论:

您可以在表单之间传递数据对象作为构造函数参数或每个表单上的公共属性。例如,您的代码可能类似于以下内容,其中每个表单都有一个“下一步”按钮,单击该按钮时,将关闭当前表单并使用相同的数据对象打开下一个表单。 MyDataClass对象作为构造函数参数传递给每个表单。最后一个表单没有“下一步”按钮,而是有一个“保存”按钮,当然会保存数据:

public partial class Form1
{
    private MyDataClass _Data;

    public Form1(MyDataClass data)
    {
        InitializeComponent();

        this._Data = data;

        // TODO: initialize fields with values from this._Data
    }

    protected void btnNext_Click(object sender, EventArgs e)
    {
        // TODO: store field values to this._Data

        // close this form
        this.Close();

        // show the next form and pass the data object along to the next form
        Form2 form = new Form2(this._Data);
        form.Show();
    }
}

public partial class Form2
{
    private MyDataClass _Data;

    public Form2(MyDataClass data)
    {
        InitializeComponent();

        this._Data = data;

        // TODO: initialize fields with values from this._Data
    }

    protected void btnNext_Click(object sender, EventArgs e)
    {
        // TODO: store field values to this._Data

        // close this form
        this.Close();

        // show the next form and pass the data object along to the next form
        Form2 form = new Form2(this._Data);
        form.Show();
    }
}

// ...

public partial class Form12
{
    private MyDataClass _Data;

    public Form12(MyDataClass data)
    {
        InitializeComponent();

        this._Data = data;

        // TODO: initialize fields with values from this._Data
    }

    protected void btnSave_Click(object sender, EventArgs e)
    {
        // TODO: store field values to this._Data

        // TODO: save the data stored in this._Data, since this is the last form

        // close this form
        this.Close();
    }
}

答案 3 :(得分:1)

如果绝对必须使用静态,这意味着创建新对象不会删除属性(因为它们是静态的),您可以考虑:

  • 使用单例模式来“模拟”静态行为。
  • 您可以考虑创建应用程序域。创建新的应用程序域时,将重新创建静态类(包含其属性和字段以及其他所有内容),并再次调用静态构造函数。

希望这有帮助

答案 4 :(得分:0)

您可以在循环中使用using statement来限制对象的范围。

while (i_still_have_more_users_to_process)
{
    using (MyObject myObject = new MyObject())
    {
    // Do stuff with forms and myObject
    }
}