【问题标题】:How do I change the value of form controls without triggering any event?如何在不触发任何事件的情况下更改表单控件的值?
【发布时间】:2018-01-23 13:39:04
【问题描述】:

我想在加载表单时更改分配给 c# (visual studio 2010) 中表单控件的值。 我希望我的表单应该显示给最终用户,但在我从服务器获取数据的同时,我希望它能够将相同的数据反映到控件上。 (不使用任何计时器、线程或任何事件)。

示例:textBox1.text ="abc";

如果服务器发送“xyz”而不是表单已经加载,testbox 的值应该自动更改为 xyz。

无需任何点击或任何类型的事件。

【问题讨论】:

  • 查看表单加载事件。从服务器获取数据并在那里设置控件值。我应该尝试展示一些你尝试过的代码,否则你会被否决。
  • 如果表单已加载但您不想要计时器、线程或事件,它如何从某个服务器读取?
  • 我已经有一个线程正在监听服务器,即我不能使用另一个线程。@BugFinder
  • 我的表单已经加载我不能使用 Forms_Load 事件@Wheels73
  • 因此,您希望在从服务器接收到数据时更新表单,而无需任何用户交互。似乎您需要在您的应用程序中实现观察者模式。试试这个链接,它可能会有所帮助codeproject.com/Tips/769084/Observer-Pattern-Csharp

标签: c# events event-handling form-control form-load


【解决方案1】:

你必须看看 c# 中的 Properties 是如何工作的:

如果我们在sharplab.io 上反编译一个简单的类

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

您将看到编译将始终生成支持字段以及 getter 和 setter 方法。

因此,如果您不想触发事件,则必须绕过这些方法,因为事件很可能会在那里触发。

这应该可以通过通常很容易做到的反射来实现。 但是文本框似乎没有一个支持字段,它的文本属性很容易访问。很可能它是由其私有 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!");
    }

我建议您深入研究反射,并使用 typeof(TextBox).GetFields / .GetProperties 查看您可以在 TextBox 类中找到什么,因为某处必须有一个字段或属性,您可以更改它以绕过您的触发事件的setter方法。

希望这会有所帮助。

【讨论】:

  • 这个答案我们有 button2_click 事件,就我而言,我使用任何控制事件或线程
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-07
相关资源
最近更新 更多