当前位置:  开发笔记 > 编程语言 > 正文

如何在绑定到DataTable的ComboBox中插入"Empty"字段

如何解决《如何在绑定到DataTable的ComboBox中插入"Empty"字段》经验,为你挑选了3个好方法。

我在WinForms应用程序上有一个组合框,其中可以选择一个项目,但它不是必需的.因此,我需要一个'Empty'第一项来表示没有设置任何值.

组合框绑定到从存储过程返回的DataTable(我没有在我的UI控件上为匈牙利表示法道歉:p):

 DataTable hierarchies = _database.GetAvailableHierarchies(cmbDataDefinition.SelectedValue.ToString()).Copy();//Calls SP
 cmbHierarchies.DataSource = hierarchies;
 cmbHierarchies.ValueMember = "guid";
 cmbHierarchies.DisplayMember = "ObjectLogicalName";

我怎么能插入这样一个空项目?

我有权更改SP,但我真的不想用UI逻辑"污染"它.

更新:这是我已经空白的DataTable.NewRow(),谢谢.我已经对你进行了修改(无论如何都是3个答案).在决定'回答'之前,我试图让迭代器模式工作

更新:我认为这个编辑让我进入了社区Wiki的土地,我决定不指定单个答案,因为它们都有其领域背景的优点.感谢您的集体投入.



1> Vivek..:

你可以做两件事:

    将空行添加到DataTable从存储过程返回的行.

    DataRow emptyRow = hierarchies.NewRow();
    emptyRow["guid"] = "";
    emptyRow["ObjectLogicalName"] = "";
    hierarchies.Rows.Add(emptyRow);
    

    创建DataView并使用ObjectLogicalName列对其进行排序.这将使新添加的行成为DataView中的第一行.

    DataView newView =           
         new DataView(hierarchies,       // source table
         "",                             // filter
         "ObjectLogicalName",            // sort by column
         DataViewRowState.CurrentRows);  // rows with state to display
    

    然后设置数据视图作为DataSourceComboBox.

    如果你真的不想添加如上所述的新行.您可以ComboBox通过简单地处理"删除"按键事件来允许用户将值设置为null.当用户按Delete键时,将其设置SelectedIndex为-1.你也应该设置ComboBox.DropDownStyleDropDownList.因为这会阻止用户编辑中的值ComboBox.



2> 小智..:
cmbHierarchies.SelectedIndex = -1;


这将显示一个空项目,直到您做出选择,它不会插入一个空项目

3> Jason Jackso..:

我通常会为这类事物创建一个迭代器.它可以避免污染您的数据,并且可以很好地处理数据绑定:

DataTable hierarchies = _database.GetAvailableHierarchies(cmbDataDefinition.SelectedValue.ToString()).Copy();//Calls SP
cmbHierarchies.DataSource = GetDisplayTable(hierarchies);
cmbHierarchies.ValueMember = "guid";
cmbHierarchies.DisplayMember = "ObjectLogicalName";

...

private IEnumerable GetDisplayTable(DataTable tbl)
{
    yield return new { ObjectLogicalName = string.Empty, guid = Guid.Empty };

    foreach (DataRow row in tbl.Rows)
        yield return new { ObjectLogicalName = row["ObjectLogicalName"].ToString(), guid = (Guid)row["guid"] };
}

免责声明:我没有编译此代码,但多次使用此模式.

注意:我在过去几年里一直在WPF和ASP.Net领域.显然,Winforms组合框需要IList,而不是IEnumerable.更昂贵的操作是创建列表.这段代码真的很简洁,我真的,真的没有编译它:

DataTable hierarchies = _database.GetAvailableHierarchies(cmbDataDefinition.SelectedValue.ToString()).Copy();
List> list = new List>(hierarchies.Rows.Cast().Select(row => new KeyValuePair(row["Name"].ToString(), (Guid)row["Guid"])));
list.Insert(0, new KeyValuePair(string.Empty, Guid.Empty));
cmbHierarchies.DataSource = list;
cmbHierarchies.ValueMember = "Value";
cmbHierarchies.DisplayMember = "Key";

推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有