今天在项目中再次碰到了问题,就是Combobox中的值如果是直接绑定很简单。简单添加项就行了。代码如下:
<ext:ComboBox ID="ComBox_Sex" runat="server" FieldLabel="性别" Width="250" EmptyText="请选择性别..." >
<Items>
<ext:ListItem Text="男性" Value="1"/>
<ext:ListItem Text="女性" Value="2" />
</Items>
</ext:ComboBox>
一、但是要从数据库中获取绑定该如何操作呢?
官方例子是用的后台数组做的,下面用 datatable来实现如下:
在页面中,首先是aspx页面的代码:
<form id="form1" runat="server">
<ext:ResourceManager ID="ResourceManager1" runat="server"/>
<ext:Store ID="Store_SexCom" runat="server">
<Reader>
<ext:JsonReader>
<Fields>
<ext:RecordField Name="SexID" Type="Int"/>
<ext:RecordField Name="SexName" Type="String" />
</Fields>
</ext:JsonReader>
</Reader>
</ext:Store>
<ext:ComboBox ID="cboxSex" runat="server" FieldLabel="性别" Width="250" EmptyText="请选择性别..." StoreID="Store_SexCom" ValueField="SexID" DisplayField="SexName">
</ext:ComboBox>
</form>
</body>
</html>
后台.cs文件代码:
protected void Page_Load(object sender, EventArgs e)
{
if (!X.IsAjaxRequest)
{
//首次加载时执行
DataSet ds_Com= getSex(); //返回的值是DataSet类型的数据
DataTable dt_Com = ds_Com.Tables[0];
//获取表中数据,Combobox一般的参数都是两个:Value传递的参数和Test显示的值
List<object> list = new List<object>(dt_Com.Rows.Count);
foreach (DataRow dr_Com in dt_Com.Rows) //遍历获取两个值
{
list.Add(new
{
SexID =Int32.Parse( dr_Com["SexID"].ToString()), SexName = dr_Com["SexName"].ToString()
}); }
Store_SexCom.DataSource = list;
//绑定数据
Store_SexCom.DataBind();
}
}
这样,简单的数据绑定就实现了,其实还是挺简单的吧。
二、上面的方法虽然看起来挺清晰的,但用起来还是有点麻烦,那么下面就来个更简单更直观的方法吧:
DataSet ds= getSex();
DataTable dt= ds.Tables[0];
//获取表中性别下拉数据参数都是两个:Value传递的参数和Test显示的值
foreach (DataRow dr in dt.Rows) //遍历获取两个值
{
Ext.Net.ListItem liSex= new Ext.Net.ListItem();
//每次创建一个Ext.Net.ListItem的对象
liSex.Value = dr["SexID"].ToString();
liSex.Text = dr["SexName"].ToString();
ComBox_Sex.Items.Add(liSex);
}
}
分别遍历的把每行的值赋值给该对象的Text和Value属性。然后用Items.Add(liSex)的方法添加到List中即可。
主要思想也就是把每个dr转换成一个listItem放进到Combox里
三、解决combox中增加"全部"选项处理方式:
下拉框Combox绑定数据源,增加一个“全部”。再进行数据绑定、或者像二中进行listitem项增加方法同样适用。

WarningOnDirty="false"
四、其实上面的方法已经很简单明了了,但我们还要进行再简化或者做成通用。代码如下:
/// <summary>
/// 绑定下拉框列表
/// </summary>
/// <param name="userInfo">用户信息</param>
/// <param name="comboBox">下拉框</param>
/// <param name="itemCode">编码</param>
/// <param name="addAllItem">是否增加全部</param>
public static void GetItemDetails(BaseUserInfo userInfo, ComboBox comboBox, string itemCode, bool addAllItem = true)
{
DataTable dataTable = SNFService.Instance.ItemDetailsService.GetDataTableByCode(userInfo, itemCode);
Ext.Net.ListItem listItem;
//设置“全部”选项
if (addAllItem)
{
listItem = new Ext.Net.ListItem();
listItem.Value = ItemListCategory.All.ToString();
listItem.Text = AppMessage.All;
comboBox.Items.Add(listItem);
comboBox.Select(listItem);
}
//设置"下拉"数据项
foreach (DataRow dr in dataTable.Rows)
{
listItem = new Ext.Net.ListItem();
listItem.Value = dr[BaseItemDetailsEntity.FieldItemValue].ToString();
listItem.Text = dr[BaseItemDetailsEntity.FieldItemName].ToString();
comboBox.Items.Add(listItem);
}
}