2015-01-21 88 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