Как я могу изменить значение элементов управления формы без запуска какого-либо события?

Я хочу изменить значение, назначенное для управления формой в C# (Visual Studio 2010), пока форма загружена. Я хочу, чтобы моя форма отображалась для конечного пользователя, но в то же время, когда я получаю данные с сервера, я хочу, чтобы они отражали те же данные на элементах управления. (без использования таймера, потока или какого-либо события).

Пример: textBox1.text ="abc";

если сервер отправляет "xyz", тогда, когда форма уже загружена, значение testbox должно автоматически измениться на xyz.

без каких-либо щелчков или каких-либо событий.

1 ответ

Вы должны посмотреть, как работают свойства в C#:

Если мы декомпилируем простой класс на sharplab.io

    public class C {
    public int foo
    {get;set;}
}

Вы увидите, что компиляция всегда будет генерировать вспомогательные поля, а также метод получения и установки.

Поэтому, если вы не хотите запускать событие, вам придется обойти эти методы, так как, скорее всего, событие там будет запущено.

Это должно быть выполнимо с отражением, которое обычно довольно легко сделать. НО текстовое поле, кажется, не имеет вспомогательного поля, которое легко доступно для его свойства текста. Скорее всего, это установлено его частным полем StringSource. Который из внутреннего типа StringSource. Итак, сначала мы должны получить тип. Получить ссылку на конструктор, затем вызвать его и установить личное поле.

Вот как далеко я зашел:

    private int number = 0;

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        number++;

        this.textBox1.Text = number.ToString();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        number++;

        Type cTorType = typeof(string[]);
        string[] cTorParams = new string[] { number.ToString() };

        Type type = this.textBox1.GetType().GetRuntimeFields().ElementAt(11).FieldType;
        ConstructorInfo ctor = type.GetConstructor(new[] { cTorType });
        object stringSourceInstance = ctor.Invoke(new[] { cTorParams });

        this.textBox1.GetType().GetRuntimeFields().ElementAt(11).SetValue(this.textBox1, stringSourceInstance);
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        MessageBox.Show("Changed!");
    }

Я бы порекомендовал немного больше поразмышлять и посмотреть, что вы можете найти в классе TextBox, используя typeof(TextBox).GetFields / .GetProperties, потому что где-то должно быть поле или свойство, которое вы можете изменить, чтобы обойти запуск метода сеттера. событие.

Надеюсь это поможет.

Другие вопросы по тегам