-2
    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) 内のすべての値に対して初期化する必要がありますか? もしそうなら、リストボックスに追加するときにどうすればいいですか?

4

2 に答える 2

1

はい、 somearray を にキャストすることはできません 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);
}
于 2013-09-17T13:59:26.423 に答える
0

最初のエラーは、メソッドが a を予期している場合、そのobject[]ために a を使用できません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;

これにより、結果は次のように表示されます。

ここに画像の説明を入力

DisplayMemberValueMemberプロパティを設定することもできます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し、選択すると関連の値を取得しますProc_Id

于 2013-09-17T14:07:12.977 に答える