1

DataGridView実行時にいくつかの列が取り込まれる がありますComboBoxColumn。例えば、

var newCountryColumn = new DataGridViewComboBoxColumn();
newCountryColumn.HeaderText = "Country";
newCountryColumn.DataSource = CountryListArray.ToArray();
newCountryColumn.DisplayMember = "Name";
newCountryColumn.ValueMember = "Code";

等々。ここで、実行時にユーザーが開くファイルを選択すると、ファイルは行ごとに配列に解析されます。

var lines = File.ReadAllLines(path + "\\" + choosenFile);
foreach (string line in lines) {
    numOfRecords++;
    errorCounter = 0;
    string[] items = line.Split('\t').ToArray();

    int billState = headerIndex[0] - 1;
    int billCountry = headerIndex[1] - 1;
    int shipState = headerIndex[2] - 1;
    int shipCountry = headerIndex[3] - 1;

    for (int i = 0; i < headerIndex.Count; i++) {
        int index = headerIndex[i];
        /*Get the state and country codes from the files using the correct indices*/
        Globals.Code = items[index - 1].ToUpper();
        //If the code can't be found in either list
        if (!CountryList.ContainsKey(Globals.Code) && !StateList.ContainsKey(Globals.Code)) {
            errorCounter++;
            if (errorCounter == 1){
                dataGridView1.Rows.Add(items);
            }
        }
    }
}

DataGridViewこれで、コンボボックスがある場所までスクロールするときを除いて、うまく機能します。どうやらコードは、項目配列の値が既存のコンボボックス列に追加されるのを好まないようです。エラーダイアログが表示されます:

DataGridView で次の例外が発生しました: System.ArguementException: DataGridViewComboBoxCell 値が無効です。

項目配列の項目をコンボ ボックス列に表示できますか?

4

1 に答える 1

0
newCountryColumn.DisplayMember = "Name";
newCountryColumn.ValueMember = "Code";

およびnewCountryColumn.DataSourceという名前のプロパティを持つコレクションを期待するように指示します。しかし、あなたはそれを渡します。それは間違っています。これは、エラー メッセージが伝えていることです。NameCodestring[]

これを正しく行うにはいくつかの方法があります。最も簡単なのは、プロパティNameとを使用して独自のクラスを宣言することCodeです。

class CountryTuple
{
    public string Code { get; private set; }
    public string Name { get; private set; }

    public CountryTuple(string code, string name)
    {
        this.Code = code;
        this.Name = name;
    }
}

これで、コレクションをインスタンス化できます:

var cts = new List<CountryTuple>();

コレクションにインスタンスを追加::

cts.Add(new CountryTuple(items[index - 1].ToUpper(), whatever));

そしてそれをあなたに割り当てますDataSource

newCountryColumn.DataSource = cts;
于 2012-12-13T23:12:30.603 に答える