2011-06-28 32 views
1

我有一種情況,用戶有大約100個控件,主要是多選列表框 ,但其他一些東西(下拉式複選框),並縮小了篩選的複雜搜索條件。當他們回來後,他們希望提起一個記錄來重置控件到他們用來匹配標準的值。C#將數據恢復到控件Iterativley

因此,我製作了一個表,每個控件都有一個列,並且iterativley存儲這些值 - 逗號 已刪除的列表框 - 當用戶鎖定搜索條件以移至下一步時。

其他然後使用開關來說,如果值是x:設置控制x值(s)所以是否有一個很好的方式來遍歷這個,看到列的名稱是控件的名稱?我此刻難倒...

enter image description here

var CParam = QueryFnc.RstrCntrls(Jnum, Qnum); 
    foreach(var a in CParam) 
    { 
     //Map Values to Matching Named Control 


    } 
+0

您應該分享一些代碼,向我們展示控件集合的外觀。你可能想看看標籤排序,但在你的情況下可能還不夠。 –

+0

@ J.N。這就是關於我目前的情況......我更多的是在思考階段大聲笑......我可以輕鬆地做一個300線路切換,但我想我會考慮一個更好的方法來解決它 –

回答

2

只要您的控制樹保持不變,您可以使用控制索引來映射值。然而,更好的選擇是使用控件ID(如果它的.NET4用於可預測的ID或手動ID分配以獲得更好的控件)來映射值。

而不是在一行中存儲跨列的值,我會更喜歡一個表,將跨行存儲值。例如,

UserId ColumnName ControlID Value 
------ ---------- --------- -------- 
1  ABC   ddlAbc  52 
1  XYZ   ddlXyz  102, 32 
... 
2  XYZ   ddlXyz  23 

這會使事情變得簡單很多 - 獲取給定用戶ID的行,然後遍歷行。對於每一行,您都可以使用FindControl方法找到控件(如果您在控件層次結構中命名容器,則可能需要彙總遞歸實現),然後編寫簡單的switch語句以根據控件類型爲控件賦值。

0

你可能想使用反射,每個控制應該有從單一界面inheits一個工廠方法,以允許傳入存儲值。

與反思,你可以找到(然後實例),通過其控制的名字(作爲一個字符串)

編輯: 只是想大聲這裏......您可能還可以使用鏈條的職責模式,將列的名稱傳遞給您的類列表,每個對象負責捕獲它負責的名稱,並返回一個實例。

+0

類似於http: //www.codeproject.com/KB/architecture/FactoryMethod_Reflection.aspx? –

+0

該文章看起來很有幫助。 –