我希望在加载表单时更改分配给c#(visual studio 2010)中表单控件的值。 我希望我的表单应该显示给最终用户,但在我从服务器获取数据的同时,我希望它将相同的数据反映到控件上。 (没有任何使用计时器,线程或任何事件)。
示例:textBox1.text =“abc”;
如果服务器发送“xyz”而不是表单已加载,则testbox的值应自动更改为xyz。
没有任何点击或任何类型的事件。
答案 0 :(得分:0)
你必须看看c#中的属性如何工作:
如果我们在sharplab.io上反编译一个简单的类
public class C {
public int foo
{get;set;}
}
您将看到编译将始终生成支持字段以及getter和setter方法。
因此,如果您不想触发事件,则必须绕过这些方法,因为很可能会在那里触发事件。
这应该可以通过反射来实现,这通常很容易做到。 但是Textbox似乎没有一个可以通过Text-Property轻松访问的支持字段。最有可能的是它由其私有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因为某处必须有一个字段或属性,你可以改变它来绕过你的setter方法触发事件。
希望这有帮助。