有看到一网友在论坛上问问题,Insus.NET尝试了一下,下面提供Insus.NET所理解的基础之上的解决方案,仅供参考,原问题如下:

给通用控件赋值_DropDownList



在解决之前,先准备一些数据吧。端午节快到了,公司分福利,希望你们公司也有。数据集是一个Hashtable:


给通用控件赋值_HashTable_02给通用控件赋值_Adapter_03


private Hashtable GetData()
{
Hashtable ht = new Hashtable();
ht.Add(1, "粽子");
ht.Add(2, "苹果");
ht.Add(3, "雪梨");
ht.Add(4, "荔技");
ht.Add(5, "现金");
return ht;
}

View Code

在站点上创建一个网页,在.aspx页面上,写上下面代码:

给通用控件赋值_HashTable_04



到Insus.NET的博客上,下载两个给件,是专为ListControl绑定的,已经重构过了的:


解压之后,把DLL拉入BIN目录中。如:

给通用控件赋值_HashTable_05



然后,我们去.aspx.cs为页面的CheckBoxList,DropDownList,RadioButtonList控件绑定数据源。

给通用控件赋值_HashTable_06



接下来,我们想在文本框填入一些值,这个值能够指向那些控件中选项的值,如果没有对应的值,控件将是回归至默认(缺省值)的状态。由于每个控件是不同的对象,为了能让它们能够互动,有一致的动作,Insus.NET写一个接口:

给通用控件赋值_CheckBoxList_07



下面,要看你需要什么控件来互动了,也就是什么控件来接收文本框的值了。需要的控件,均接中写一个适配器(Adapter),由于Insus.NET仅列举了三个,因此分别写三个适配器。


给通用控件赋值_HashTable_02给通用控件赋值_Adapter_03


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;

/// <summary>
/// Summary description for InsusCheckBoxList
/// </summary>
namespace Insus.NET
{
public class InsusCheckBoxList: InsusAdapter
{
CheckBoxList _CheckBoxList;

public InsusCheckBoxList()
{
//
// TODO: Add constructor logic here
//
}

public void SetValue(WebControl wc, object value)
{
if (wc is CheckBoxList)
{
_CheckBoxList = (CheckBoxList)wc;

foreach (ListItem li in this._CheckBoxList.Items)
{
li.Selected = li.Text == value.ToString() ? true : false;
}
}
}
}
}

InsusCheckBoxList

 


给通用控件赋值_HashTable_02给通用控件赋值_Adapter_03


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;

/// <summary>
/// Summary description for InsusDropDownList
/// </summary>
namespace Insus.NET
{


public class InsusDropDownList: InsusAdapter
{
DropDownList _DropDownList;

public InsusDropDownList()
{
//
// TODO: Add constructor logic here
//
}

public void SetValue(WebControl wc, object value)
{
if (wc is DropDownList)
{
_DropDownList = (DropDownList)wc;

this._DropDownList.ClearSelection();
foreach (ListItem li in this._DropDownList.Items)
{
if (li.Text == value.ToString ())
this._DropDownList.Items.FindByText(value.ToString()).Selected = true;
}
}
}
}
}

InsusDropDownList

 


给通用控件赋值_HashTable_02给通用控件赋值_Adapter_03


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;

/// <summary>
/// Summary description for InsusRadioButtonList
/// </summary>
namespace Insus.NET
{
public class InsusRadioButtonList: InsusAdapter

{
RadioButtonList _RadioButtonList;

public InsusRadioButtonList()
{
//
// TODO: Add constructor logic here
//
}

public void SetValue(WebControl wc, object value)
{
if (wc is RadioButtonList)
{
_RadioButtonList = (RadioButtonList)wc;

foreach (ListItem li in this._RadioButtonList.Items)
{
li.Selected = li.Text == value.ToString() ? true : false;
}
}
}
}
}

InsusRadioButtonList

 

 如果还有基它,继续写出来......

下面就是Button按钮的Click事件:

给通用控件赋值_RadioButtonList_14



好了,还是看看最终的效果吧:

给通用控件赋值_DropDownList_15

 


以下内容,于2013-06-11 09:00添加:


早上来看到第一次所想的,有些地方,觉得设计不好。按照面向对象的设计理念来说,接口设计的藕合性过高,接口内方法SetValue需要带两个参数。理想的带一个参数为好。

因此,Insus.NET把接口改为:


给通用控件赋值_HashTable_02给通用控件赋值_Adapter_03


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;

/// <summary>
/// Summary description for InsusAdapter
/// </summary>
namespace Insus.NET
{
public interface InsusAdapter
{
void SetValue(object value);
}
}

View Code

这样一改的话,那怎样知道是给那个一个控制赋值? 解决这个问题,我们可以使用构造函数来处理。回到上面的那三个适配器InsusCheckBoxList,InsusDropDownList,InsusRadioButtonList,下面是重构好之后的适配器:


给通用控件赋值_HashTable_02给通用控件赋值_Adapter_03


using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;

/// <summary>
/// Summary description for InsusCheckBoxList
/// </summary>
namespace Insus.NET
{
public class InsusCheckBoxList : InsusAdapter
{
CheckBoxList _CheckBoxList;

public InsusCheckBoxList(CheckBoxList checkBoxList)
{
this._CheckBoxList = checkBoxList;
}

public void SetValue(object value)
{
foreach (ListItem li in this._CheckBoxList.Items)
{
li.Selected = li.Text == value.ToString() ? true : false;
}
}
}
}

InsusCheckBoxList

 


给通用控件赋值_HashTable_02给通用控件赋值_Adapter_03


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;

/// <summary>
/// Summary description for InsusDropDownList
/// </summary>
namespace Insus.NET
{
public class InsusDropDownList : InsusAdapter
{
DropDownList _DropDownList;

public InsusDropDownList(DropDownList dropDownList)
{
this._DropDownList = dropDownList;
}

public void SetValue(object value)
{
this._DropDownList.ClearSelection();
foreach (ListItem li in this._DropDownList.Items)
{
if (li.Text == value.ToString())
this._DropDownList.Items.FindByText(value.ToString()).Selected = true;
}
}
}
}

InsusDropDownList

 


给通用控件赋值_HashTable_02给通用控件赋值_Adapter_03


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;

/// <summary>
/// Summary description for InsusRadioButtonList
/// </summary>
namespace Insus.NET
{
public class InsusRadioButtonList : InsusAdapter
{
RadioButtonList _RadioButtonList;

public InsusRadioButtonList(RadioButtonList radioButtonList)
{
this._RadioButtonList = radioButtonList;
}

public void SetValue(object value)
{
foreach (ListItem li in this._RadioButtonList.Items)
{
li.Selected = li.Text == value.ToString() ? true : false;
}
}
}
}

InsusRadioButtonList

 

重构之后,控件就可以在适配器new实例化时,就传入去了。

给通用控件赋值_DropDownList_24



可以参考下面重构全过程:

给通用控件赋值_DropDownList_25



以下内容,于2013-06-11 10:20添加:


此部分内容,只是重构一下comments的语句,因为每个控件的适配器有实作接口,所以使用多态来重构它们。

给通用控件赋值_RadioButtonList_26