0

DataGridViewと[新しいエントリの追加]ボタンがあります。データベースに新しいエントリを追加するたびに、プログラムでDataGridViewの新しいエントリの行を選択する必要があります。[新しいエントリの追加]ボタンをクリックすると、以下の関数が呼び出され、studentNameと日付のパラメーターが関数に渡されます。DataGridViewの名前はdvgPontengHistoryです。

ただし、スローされる例外があります。

オブジェクト参照がオブジェクト インスタンスに設定されていません。

この行で:

if(r.Cells["student_name"].Value.ToString().Contains(studentName))

以下はコードです:

   private void selectRow(string studentName, string date)
    {
        int i = 0;
        foreach (DataGridViewRow r in dgvPontengHistory.Rows)
        {
            if(r.Cells["student_name"].Value.ToString().Contains(studentName)) // error in this line
            {
                if (r.Cells["date"].Value.ToString().Contains(date))
                {
                    dgvPontengHistory.Rows[i].Selected = true;
                    return;
                }
            }
            i++;
        }
    }

この問題を解決するためのヒントはありますか?ありがとう。

4

2 に答える 2

2

おそらく、student_nameが結果セットの行の中でnullであった場合です。これにより、ToString()が失敗します。

私の推測では、あなたの更新ステートメントはあなたのテーブルにnullを入れています。

テスト方法は次のとおりです。

(スローラインにブレークポイントを設定します)。

  private void selectRow(string studentName, string date)
    {
        int i = 0;
        foreach (DataGridViewRow r in dgvPontengHistory.Rows)
        {
            if (r.Cells["student_name"] == null) { throw("can't find cell"); }
            if(r.Cells["student_name"].Value == null) { throw("cell has no value"); }
            if(r.Cells["student_name"].Value.ToString().Contains(studentName)) // error in this line
            {
                if (r.Cells["date"].Value.ToString().Contains(date))
                {
                    dgvPontengHistory.Rows[i].Selected = true;
                    return;
                }
            }
            i++;
        }
    }
于 2012-08-14T12:15:15.240 に答える
1
private void selectRow(string studentName, string date)
{
    int i = 0;
    foreach (DataGridViewRow r in dgvPontengHistory.Rows)
    {
        if(r.Cells["student_name"].Value == null) return;
        if(r.Cells["student_name"].Value.ToString().Contains(studentName)) // error in this line
        {
            if (r.Cells["date"].Value.ToString().Contains(date))
            {
                dgvPontengHistory.Rows[i].Selected = true;
                return;
            }
        }
        i++;
    }
}
于 2012-08-14T12:16:40.060 に答える