重新加载Windows Forms变量而不重新加载表单布局

时间:2018-06-26 02:42:42

标签: c# winforms

是否可以重新加载表单变量?

string a = ""

public form1()
{
    InitializeComponent();
}

private void form1_load(object sender, EventArgs e)
{
     a = "Something";
     textbox1.Text = a;
}

是否可以将“ a”的值重置为空,并在文本框中显示文本?我可以创建一个函数来将“ a”的值设置为空并清空文本框,但是由于我有很多变量,我想避免这样做,因为我可能会错过一个会引起错误的错误。我想知道是否有办法做到这一点。

我不想重新初始化表单,因为它有点慢,无法再次重新加载表单图形。感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

我会这样工作:

public struct Snapshot
{
    public string a;
    public int? b;
}

private Snapshot _initial;

private void form1_Load(object sender, EventArgs e)
{
     _initial = this.CreateSnapshot();
}

private Snapshot CreateSnapshot()
{
    return new Snapshot()
    {
        a = textbox1.Text,
        b = int.TryParse(textbox2.Text, out int x) ? (int?)x : null
    }
}

private void button1_Click(object sender, EventArgs e)
{
     this.RestoreSnapshot(_initial);
}

private void RestoreSnapshot(Snapshot snapshot)
{
    textbox1.Text = snapshot.a;
    textbox2.Text = snapshot.b.HasValue ? snapshot.b.Value.ToString() : "";
}

您的_initial Snapshot发生在form1_Load,以保存表格开头的位置。然后,只要想恢复您的值,就只需致电this.RestoreSnapshot(_initial);

这种方法的优点是,它允许您制作多个快照并实现“撤消”功能,并且由于您已将表格与数据分开,因此使测试更加容易。

答案 1 :(得分:0)

您是否考虑过在属性周围使用包装器以及更改通知?然后,您可以使用数据绑定使值和文本框一起更新。请参阅以下内容:

public partial class Form1 : Form
{
    public NotifyProperty<string> A { get; } = new NotifyProperty<string>();
    public NotifyProperty<double> B { get; } = new NotifyProperty<double>();

    public void Reset()
    {
        A.Value = "Something";
        B.Value = 3.14d;
    }

    public Form1()
    {
        InitializeComponent();

        textBox1.DataBindings.Add("Text", A, "Value", true, DataSourceUpdateMode.OnPropertyChanged);
        textBox2.DataBindings.Add("Text", B, "Value", true, DataSourceUpdateMode.OnPropertyChanged);

        Reset();
    }

    private void simpleButton1_Click(object sender, EventArgs e)
    {
        Reset();
    }
}

public class NotifyProperty<T> : INotifyPropertyChanged
{
    private T _value;

    public T Value
    {
        get => _value;
        set
        {
            if (_value != null && _value.Equals(value)) return;
            _value = value; 
            PropertyChanged?.Invoke(this,new PropertyChangedEventArgs("Value"));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;


}

调用Reset()时,A和B中的值以及textBox1和textBox2都将被更新。另外,从表单中获取结果时,可以使用A和B(不需要使用文本框,因为当用户键入文本时,A和B将自动更新)。