Bind ListBox with multiple fields

2019-06-27 04:14发布

I am using VS2010 for c#. I have some data there in a table

Scores(team1,team2,battingteam,bowlingteam,score) I am using bindingSource to bind it with my listBox. The problem is that i can show only one member in DisplayMember property of listbox (e.g. team1 or team2 only). I want to do something like

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

how to do that?

4条回答
Viruses.
2楼-- · 2019-06-27 04:21

I think the best solution for that in C# level is to have agent of KeyValuePair, add your multiple value to the key or to the value then assign it to the listbox like the following: Suppose I have List of Student Class, which is StudentsList, then:

    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();
查看更多
冷血范
3楼-- · 2019-06-27 04:22

First, you can leave your DisplayMember with one property, let's say:

ListBox1.DisplayMember = "team1";

Now, go to your form in a [Design] mode, right click on the ListBox -> Properties.

In the top of the Properties window, click on Events (lightning icon),

look for Format in the events list below (under Property Changed) and type there some event name, let's say: ListBox1Format , and press Enter. You will see this:

private void ListBox1Format(object sender, ListControlConvertEventArgs e)
{

}

And now write these following lines inside:

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;
}

That's it ;)

查看更多
Evening l夕情丶
4楼-- · 2019-06-27 04:34

I was also trying to do something similar and found with a combination of sql and display member, it was very simple. For example

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";

I found it easier to just manipulate the sql then writing lots of line of code. Hope it helps in terms of easier coding.

查看更多
来,给爷笑一个
5楼-- · 2019-06-27 04:46

I don't know in which data type you have your data ... but for example if you have them in DataTable returned from db you can create List<string> object and iterate datatable rows and create items in list object with formatting data as you want and by end bind list object to your listbox directly as below

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;
查看更多
登录 后发表回答