我的表单中有几个文本框。我已经编写了许多代码并将它们存储在数据库中:
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
在数据库中编写代码的原因是,如果用户想要在特定位置的文本框或想要更改文本框的任何属性,我们的程序员会更改该文本框的数据库中的代码,而不是重新编译软件。
有没有办法从数据库执行这些代码来相应地更改文本框的属性?
最佳答案
您需要序列化(xml 或二进制)并将值存储到数据库,然后在表单的 OnCreate 事件处理程序中从数据库读取值并使用 Reflection
相应地设置它们。
让我们看看数据库表的结构
这是我的建议
Create table FormData
(ID int,
FormFullTypeName varchar(500),
ControlName varchar(500),
PropertyName varchar(100),
Value varchar(max))
在form的OnCreate
中根据form的完整类型名查询该表,然后循环记录找到具体的Control
,然后找到对应的Property
通过 Reflection
控制,然后反序列化该值并通过 Reflection
再次将值设置到 Property。
例如,我假设您已从数据库中设置了此变量
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#
希望对你有帮助
关于c# - 从代码文件动态设置控件的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28062207/