如何给通过反射给控件赋值

jieon 2009-07-24 03:15:14
如何给通过反射出来的窗体然后给控件赋值? 如textbox1
在网上我找到如下方法:
/// <summary>
/// 通过反射给控件赋值操作
/// </summary>
/// <param name="ClassName">类名</param>
/// <param name="ControlName">控件名称</param>
/// <param name="PropertyName">属性名称</param>
/// <param name="PropertyValue">属性值</param>
public void SetControl(object ClassName, String ControlName, string PropertyName, object PropertyValue)
{
Assembly fn = Assembly.GetExecutingAssembly();
Form newForm = fn.CreateInstance("test.ChatFormList." + ClassName) as Form;
Type type = newForm.GetType();
FieldInfo field = type.GetField(ControlName, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
if (ControlName != null)
{
object obj;
PropertyDescriptorCollection s = TypeDescriptor.GetProperties(type);
PropertyDescriptor mProperty = s.Find(PropertyName, true);
obj = field.GetValue(ClassName);
if (mProperty != null)
{
mProperty.SetValue(obj, PropertyValue);
}
}
}


运行到: obj = field.GetValue(ClassName);
出现错误:类型“test.ChatFormList.ChatForm0”上定义的字段“textBox1”不是类型为“System.String”的目标对象上的字段。 不解......
...全文
246 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
JonnySun 2009-07-25
  • 打赏
  • 举报
回复
==

我给你解决加100分
JonnySun 2009-07-25
  • 打赏
  • 举报
回复
ok了,搞了我20分钟
http://www.vjsdn.com/bbs/bbsTopicDetails.aspx?pid=410
jieon 2009-07-24
  • 打赏
  • 举报
回复
随便放值也不行 但控件确实是找到了。
jieon 2009-07-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 cpp2017 的回复:]
你用反射创建的那个实例不是当前的form
[/Quote]

不是当前,但也是已经打开了的。
cpp2017 2009-07-24
  • 打赏
  • 举报
回复
你用反射创建的那个实例不是当前的form
cpp2017 2009-07-24
  • 打赏
  • 举报
回复
你换个字符串看看:“AAAAAAAA”
jieon 2009-07-24
  • 打赏
  • 举报
回复
Assembly fn = Assembly.GetExecutingAssembly();
Form newForm = fn.CreateInstance("Jackch.ChatFormList." + formname) as Form;
Control[] control = newForm.Controls.Find(boxname, false);
发现这反射这窗体会实例化一下....也没道理没信息啊.
jieon 2009-07-24
  • 打赏
  • 举报
回复
Control[] control = newForm.Controls.Find(boxname, false);
if (control.Length > 0)
{
((TextBox)control[0]).Text += tach.ChatMessage[id];
tach.ChatMessage.Remove(id);
break;
}

找到控件了 就是赋值没成功 ....
jieon 2009-07-24
  • 打赏
  • 举报
回复
winfrom 没有....
来人啊
cpp2017 2009-07-24
  • 打赏
  • 举报
回复
如果是winform:

Control[] controls = this.Controls.Find("TextBox2",false);
if (Controls.Count > 0)
{
((TextBox)controls[0]).Text = "123";
}
jieon 2009-07-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cpp2017 的回复:]
对于控件,直接用page.FindContorl(id) 就可。

[/Quote]
不同命名空间也行? winform的是。我先试试去
cpp2017 2009-07-24
  • 打赏
  • 举报
回复
对于控件,直接用page.FindContorl(id) 就可。

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧