将 ListBox 与多个字段绑定

Posted

技术标签:

【中文标题】将 ListBox 与多个字段绑定【英文标题】:Bind ListBox with multiple fields 【发布时间】:2011-03-07 02:33:38 【问题描述】:

我正在为 c# 使用 VS2010。我在表格中有一些数据

Scores(team1,team2,battingteam,bowlingteam,score) 我正在使用 bindingSource 将它与我的 listBox 绑定。问题是我只能在列表框的 DisplayMember 属性中显示一个成员(例如仅 team1 或 team2)。我想做类似的事情

team1 + " vs " + team2 + ": " + battingteam +" Score: " + score

怎么做?

【问题讨论】:

您使用的是 WinForms 还是 WPF? 您的数据采用哪种格式.. ?? 【参考方案1】:

首先,您可以为 DisplayMember 保留一个属性,例如:

ListBox1.DisplayMember = "team1";

现在,以 [设计] 模式进入您的表单, 右键单击列表框 -> 属性。

在属性窗口的顶部,点击事件(闪电图标),

在下面的事件列表中(在 Property Changed 下)查找 Format 并在其中键入一些事件名称,例如: ListBox1Format ,然后按 Enter。你会看到这个:

private void ListBox1Format(object sender, ListControlConvertEventArgs e)



现在在里面写下以下几行:

private void ListBox1Format(object sender, ListControlConvertEventArgs e)

    // Assuming your class called Scores
    string team1 = ((Scores)e.ListItem).team1.ToString();
    string team2 = ((Scores)e.ListItem).team2.ToString();
    string battingteam = ((Scores)e.ListItem).battingteam.ToString();
    string score = ((Scores)e.ListItem).score.ToString();

    e.Value = team1 + " vs " + team2 + ": " + battingteam +" Score: " + score;

就是这样;)

【讨论】:

【参考方案2】:

我不知道您的数据属于哪种数据类型...但是例如,如果您将它们放在从 db 返回的 DataTable 中,您可以创建 List<string> 对象并迭代数据表行并在列表对象中创建项目根据需要格式化数据,最后直接将列表对象绑定到列表框,如下所示

List<string> teams = new List<string>();
foreach (DataRow dataRow in teamsDataTable.Rows)

    teams.Add(dataRow["team1"].ToString() + " vs " + dataRow["team2"].ToString() + ": " + dataRow["battingteam"].ToString() + " Score: " + dataRow["score"].ToString());

listBox1.DataSource = teams;

【讨论】:

数据在包含许多DataTables的DataSet中。每个 dataTable 都有一个 tableAdapter 我用来获取和填充数据 我要试试那个方法 您可以使用上述方法,但需要将 teamsDataTable.Rows 替换为 dataset.Table[X].Rows【参考方案3】:

我也在尝试做类似的事情,发现结合sql和display member,很简单。例如

string sql = "SELECT team1+ 'vs' + team2+ ':' +battingteam + 'Score:' + score";
sql += "AS newColumnNametbl from table";
ListBox lst = new ListBox();
lst.DataSource = ds; //datasource created
lst.DisplayMember = "newColumnNametbl";

我发现只操作 sql 然后编写大量代码行更容易。希望它有助于简化编码。

【讨论】:

【参考方案4】:

我认为 C# 级别的最佳解决方案是拥有 KeyValuePair 的代理,将多个值添加到键或值中,然后将其分配给列表框,如下所示: 假设我有Student Class的List,也就是StudentList,那么:

    MyListBox.DrawMode = DrawMode.Normal;
    List<KeyValuePair<string, string>> KeyValueList = new List<KeyValuePair<string, string>>();
                foreach (Student Curritem in StudentsList)
                
                    KeyValueList.Add(
                        new KeyValuePair<string, string>(Curritem.FirstName + " Age: <" + Curritem.Age + ">",
                                        Curritem.ID.ToString()));
                
                MyListBox.DisplayMember = "Key";
                MyListBox.ValueMember = "Value";
                MyListBox.DataSource = KeyValueList; 
                MyListBox.Refresh();

【讨论】:

以上是关于将 ListBox 与多个字段绑定的主要内容,如果未能解决你的问题,请参考以下文章

ListBox.SelectedItems 的双向手动绑定实现?

WPF:将 ListBox ContextMenu 的命令参数绑定到 ListBox 的选定项

将数据绑定到 ListBox 并将列表发布到数据库 mvc5

WPF问题,richtextbox控件能绑定到数据表中的一个字段吗?怎么做? listbox选中当前项的事件是啥呢?

将 Bool 绑定到 ListBox 中 TextBlock 的可见性

wpf listbox 绑定