是否可以用排序列表填充列表框?C#/WinForms

Is it possible to populate a listbox with a sortedlist? C#/WinForms

提问人:JJSutton 提问时间:11/17/2023 最后编辑:Dmitry BychenkoJJSutton 更新时间:11/17/2023 访问量:61

问:

我目前正在为一个大学项目制作一个基于刽子手的游戏的记分牌。

我被告知要创建一个记分牌,显示每个单词的最低猜测量,使用列表框显示单词+最低猜测,并使用排序列表来存储这些值。

我能够将我的最低猜测分数放入排序列表中,但是我现在正在努力寻找一种方法来将其显示在列表框中。

我尝试使用该属性来填充它,但是我收到以下错误以及代码行:listbox.DataSource

lsbScores.DataSource = scores;

System.ArgumentException:“复杂数据绑定接受 IList 或 IListSource 作为数据源。

我还想过可能做一个循环并遍历我的排序列表中的值,但是这感觉是错误的方法,如果这是正确的方法,我将如何去做?

对我来说,使用排序列表通常是错误的方法,但是这是我被告知要这样做的方式,所以我需要这样做。

C# WinForms

评论

0赞 Dmitry Bychenko 11/17/2023
lsbScores.DataSource = scores.Values.ToList();

答:

1赞 Dmitry Bychenko 11/17/2023 #1

例外情况说明了您可以尝试执行的操作:

System.ArgumentException:“复杂数据绑定接受 IList 或 IListSource 作为数据源。

(粗体是我的,德米特里)

您可以在 Linq 的帮助下提供所需类型的集合:

using System.Linq;

...

// You may want to use scores.Keys instead of scores.Values
lsbScores.DataSource = scores.Values.ToList();
1赞 Karen Payne 11/17/2023 #2

如果您定义了一个表单级别变量,如下所示

private SortedList<int, string> scores = new();

在窗体设计器中,选择“ListBox”,选择“属性”,然后选择“DisplayMember to Value”。

在代码中,使用 .ToList 分数。

lsbScores.DataSource = scores.ToList();

同时显示两者word+lowest guesses

创建一个类,例如,以下 其中 .ToString 将用作 ListBox 的 DisplayMember。

public class Guess
{
    public int Key { get; set; }
    public string Value { get; set; }
    public override string ToString() => $"{Key} - {Value}";
}

用于将数据分配给 ListBox 的模型

lsbScores.DataSource = scores
    .Select(x => new Guess()
    {
        Key = x.Key,
        Value = x.Value
    }).ToList(); ;

要获取 ListBox 中的当前项。

if (lsbScores.SelectedItem is not null)
{
    Guess current = (Guess)lsbScores.SelectedItem;
}