2011-06-28 34 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

该文章看起来很有帮助。 –