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)初始化它?如果是这样,添加到列表框后如何进行此操作?
答案 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;
这会将结果显示为:
您还可以设置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