使用已存在的数组填充列表框的问题

时间:2013-09-17 13:53:40

标签: c# winforms listbox

    struct process
    {
        public int Proc_Id;
        public int Proc_BurstTime;
        public int Proc_Priority;
    };

    readonly process[] ProcessList = new process[]
    {
        new process{ Proc_Id = 1, Proc_BurstTime = 3000, Proc_Priority = 1},
        new process{ Proc_Id = 2, Proc_BurstTime = 5000, Proc_Priority = 2},
        new process{ Proc_Id = 3, Proc_BurstTime = 1000, Proc_Priority = 3},
        new process{ Proc_Id = 4, Proc_BurstTime = 10000, Proc_Priority = 4}
    };

    private void Form1_Load(object sender, EventArgs e)
    {
        initial_ProcessList.Items.AddRange(ProcessList);
    }

这是我得到的错误:

The best overloaded method match for 'System.Windows.Forms.ListBox.ObjectCollection.AddRange(System.Windows.Forms.ListBox.ObjectCollection)' has some invalid arguments

Argument 1: cannot convert from 'OS450_Proj1.Form1.process[]' to 'System.Windows.Forms.ListBox.ObjectCollection'

我明白它看起来不喜欢那种数组,但有没有什么可以填充列表框?如果还因为没有字符串或任何“打印”到列表中的内容,我是否需要在结构中添加字符串值并为数组中的所有值(ProcessList)初始化它?如果是这样,添加到列表框后如何进行此操作?

2 个答案:

答案 0 :(得分:1)

是的,你不能向object[]投射一些内容。 ListBox.Items.AddRange要求将对象数组作为参数传递。

试试这个

initial_ProcessList.Items.AddRange(ProcessList.Cast<object>().ToArray());

或者

object[] ProcessList = new object[]
{
    new process{ Proc_Id = 1, Proc_BurstTime = 3000, Proc_Priority = 1},
    new process{ Proc_Id = 2, Proc_BurstTime = 5000, Proc_Priority = 2},
    new process{ Proc_Id = 3, Proc_BurstTime = 1000, Proc_Priority = 3},
    new process{ Proc_Id = 4, Proc_BurstTime = 10000, Proc_Priority = 4}
};

或者只是循环并添加

foreach (var p in ProcessList)
{
    initial_ProcessList.Items.Add(p);
}

答案 1 :(得分:0)

首先是错误,如果方法期待object[],则不能使用process[]。现在,如果你尝试类似的东西:

initial_ProcessList.Items.AddRange(ProcessList.Cast<object>().ToArray());

错误会消失,但ListBox项似乎如下:

WindowForm.ApplicationName.process1
WindowForm.ApplicationName.process1
.....

哪个是默认的ToString()实现。因此,您的实际问题是在ListBox中显示这些记录。您必须覆盖ToString方法。像:

struct process
{
    public int Proc_Id;
    public int Proc_BurstTime;
    public int Proc_Priority;

    public override string ToString()
    {
        return string.Format("{0}, {1}, {2}", Proc_Id, Proc_BurstTime, Proc_Priority);
    }
};

稍后如果使用DataSource属性而不是添加对象数组,那么它会更简单:

initial_ProcessList.DataSource = ProcessList;

这会将结果显示为:

enter image description here

您还可以设置DisplayMember的{​​{1}}和ValueMember属性,但这需要您的结构具有属性,而不是字段。因此,您必须将ListBox修改为:

struct

};

然后:

struct process
{
    public int Proc_Id { get; set; }
    public int Proc_BurstTime { get; set; } //auto implemented properties
    public int Proc_Priority;

这只显示initial_ProcessList.ValueMember = "Proc_Id"; initial_ProcessList.DisplayMember = "Proc_BurstTime"; initial_ProcessList.DataSource = ProcessList; ,在选择时您将获得相关Proc_BurstTime

的值