Перезагрузите переменные Windows Forms без перезагрузки макета формы - PullRequest
0 голосов
/ 26 июня 2018

Есть ли способ перезагрузить переменные формы?

string a = ""

public form1()
{
    InitializeComponent();
}

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

Есть ли способ сбросить значение «a» на пустое и текст, отображаемый в текстовом поле?Я могу создать функцию для установки значения «a», чтобы очистить и очистить текстовое поле, но, поскольку у меня много переменных, я хочу избежать этого, так как я могу пропустить такую, которая вызовет ошибку.Мне было интересно, есть ли способ сделать это.

Я не хочу повторно инициализировать форму, так как она довольно медленная, чтобы снова загрузить графику формы.Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Рассматривали ли вы использование обертки вокруг ваших свойств с уведомлением об изменениях?Затем вы можете использовать привязку данных, чтобы значение и текстовые поля обновлялись вместе.См. Следующее:

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 будут обновляться автоматически).

0 голосов
/ 26 июня 2018

Я бы работал так:

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); всякий раз, когда хотите отменить свои значения.

Преимущество такого подхода заключается в том, что он позволяет вам делать несколько снимков и реализовывать функцию «отменить» и, поскольку вы разделилиВаша форма из ваших данных, это делает тестирование проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...