是否可以重新加载表单变量?
string a = ""
public form1()
{
InitializeComponent();
}
private void form1_load(object sender, EventArgs e)
{
a = "Something";
textbox1.Text = a;
}
是否可以将“ a”的值重置为空,并在文本框中显示文本?我可以创建一个函数来将“ a”的值设置为空并清空文本框,但是由于我有很多变量,我想避免这样做,因为我可能会错过一个会引起错误的错误。我想知道是否有办法做到这一点。
我不想重新初始化表单,因为它有点慢,无法再次重新加载表单图形。感谢您的帮助。
答案 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将自动更新)。