如何在不触发任何事件的情况下更改表单控件的值?



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

示例 : 文本框1.文本 ="abc";

如果服务器正在发送"XYZ",而不是在表单已经加载时,Testbox的值应该自动更改为XYZ。

没有任何点击或任何类型的事件。

您必须查看 c# 中的属性如何工作:

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

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

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

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

这应该是可以通过通常很容易做到的反射来实现的。 但是文本框似乎没有一个支持字段,其文本属性很容易访问。它很可能是由其私有的StringSource字段设置的。它来自内部类型StringSource。所以首先我们必须得到类型。获取对构造函数的引用,然后调用 this 并设置私有字段。

这就是我所走的路:

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)查看可以在TextBox类中找到的内容。获取字段/.GetProperties,因为某个地方必须有一个字段或属性,您可以更改该字段或属性以绕过触发事件的 setter 方法。

希望这有帮助。

相关内容

  • 没有找到相关文章

最新更新