2015-01-21 48 views
1

我在表单中有几个文本框。我已经写了很多代码,并将其在数据库中存储为:
从代码文件动态设置控件的属性

Textbox1.Location = New System.Drawing.Point(609, 3) 
Textbox2.Location = New System.Drawing.Point(659, 3) 
Textbox1.BackColor = System.Drawing.Color.Green 
Textbox2.BackColor = System.Drawing.Color.Blue 
TextboxX.AnyProperty = PropertyValue 

的数据库编写代码的原因是,如果用户想要在特定位置的文本框或想改变文本框,我们的程序员的任何财产更改该文本框的数据库中的代码,而不是重新编译该软件。

有没有办法从数据库执行这些代码来相应地更改文本框的属性?

回答

1

您需要序列化(xml或二进制)并将值存储到数据库,然后在OnCreate事件处理程序中从数据库中读取值并相应地使用Reflection设置它们。

让看到的数据库表的结构

这是我在表格查询OnCreate建议

Create table FormData 
(ID int, 
FormFullTypeName varchar(500), 
ControlName varchar(500), 
PropertyName varchar(100), 
Value varchar(max)) 

基于表单的全类型名称此表,然后依次通过记录和查找特定Control和然后在Reflection的控制下找到对应的Property,然后反序列化该值并将该值再次设置为该属性Reflection

例如我假定你已经从你的数据库

var controlName = 'yourcontrolName from db'; 
var propertyName = 'your property name from db'; 
object value = //the deserialized value from db; 

var control = findControlByName(controlName); 
control.GetType().GetProperty(propertyName, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance).SetValue(control, value, new object[] { }); 

设置此变量实现findControlByName看看这个链接 Get a Windows Forms control by name in C#

我希望这可以帮助你

+0

请你给我一个链接或代码来做同样的使用反射? – 2015-01-21 08:18:05

+0

@PowerUser我已经添加了一些代码给我的回答 – RezaRahmati 2015-01-21 08:25:33

+0

@PowerUser对不起,语法是C#,你需要将其转换为vb.net – RezaRahmati 2015-01-21 08:26:34