2017-05-23 9 views
0

私はC#で自分自身を学び、新しいです。次の行を読むDataGrid各ボタンをクリック

学習目的のために、ボタンをクリックしてテキストボックスに値を表示するたびに、特定の列の行の内容を読み取ろうとしています。 DataGridViewには、約10行10列あります。これを行うには、これはこれまでのところ私のコードです:

private void button7_Click(object sender, EventArgs e) 
    { 
     int rowscount = dataGridView1.Rows.Count; 
     for (int i = 0; i < rowscount; i++) 
     { 
      textBox1.Text = 
dataGridView1.Rows[i].Cells["Columnname"].Value.ToString(); 

     } 
    } 

私はラインを切り替えることを試みた:dataGridView1.Rows [I] .Cells [ "COLUMNNAME"] Value.ToString();。 ValueToString()を呼び出すと、 "Columname"列のが正しく読み込まれ、textBox1に配置されます。しかし、再び[i]に切り替えると、次のエラーが表示されます。

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

+0

'DataGridView'の' AllowUserToAddRows'プロパティが 'true'に設定されていると、このエラーが発生します。ユーザーが行を追加できるようにするには、この「新規行」を確認する必要があります。さらに、コードは、テキストボックスのテキストをループの各繰り返しに置き換えているように見えます。これにより、グリッド内の最後の行のみのテキストを含むテキストボックスが表示されます。このボタンに何をするかを明確にすることができます。 – JohnG

+0

こんにちは、私は新しい行を追加したくない、ちょうどそのままファイルの内容を読む。はい、ボタンを押すたびに、テキストボックスはその内容をDataGridView1の同じ列名の次の行に置き換えます。 –

+0

最後のコメントが正しい場合は、なぜすべての行をループするのですか?テキストボックスの値を 'textBox1.Text = dataGridView1.Rows [rowscount - 1] .Cells [" Columnname "]に設定するだけです。Value.ToString();' – JohnG

答えて

0

ボタンをクリックすると、テキストボックスに次の行の次の値が表示されるという最後のコメントから推測しています。この場合、グリッドへの次の行インデックスを追跡するためにグローバル変数を作成する必要があります。たとえば、プログラムが開始されると、このbuttonIndexはゼロ(0)になります。ユーザーがボタンをクリックすると、buttonIndexは1になります。 buttonIndexの値がグリッドの最後の行インデックスと等しい場合は、buttonIndexの値をゼロ(0)にリセットして最初の最初の行から再スタートする必要があります。

いくつかの問題は明確ではありません。たとえば、テキストボックスの現在のテキストが、グリッド内の行4(4)の値を表示しているとします。次に、ユーザーはこの行を4つ「削除」します。テキストボックスは変更されず、削除された行4の値が表示され続けます。次に、ユーザーがボタンをクリックすると、ボタンのインデックスが行4(4)にあるため、次のインデックスは5(5)になるため、コードは行をスキップします。この例では、最初の行5(行4が削除される前)はスキップされます。

ユーザーが行を削除できる場合は、buttonIndexをそれに応じて調整する必要があります。これに対処しないと、グリッドにないテキストがテキストボックスに表示されることがあります。最悪の場合は現在のbuttonIndexを投げ捨ててクラッシュします。

上記の問題は、対処しなければならないものです。以下は、要件に応じて行をループするコードですが、行が削除された場合はbuttonIndexの更新はありません。これは、ユーザーがテキストボックスに表示されている現在の行を削除し、ユーザーがボタンをクリックして行をスキップするまでテキストボックスが変更されないことを意味します。ユーザーが行を削除しても、既存の行の範囲内にあるbuttonIndexを保持するためにいくつかのチェックがあります。私はそれが理にかなったことを願う

本当に、ユーザーが行選択を変更した場合にテキストボックスを更新しないようにしたいですか?

コード記述

グローバル変数buttonIndexはグリッドに行インデックスを維持するために使用されます。注:行buttonIndexのグリッドのテキストとテキストボックスの現在のテキストは、ユーザーが1つまたは複数の行を削除すると異なる場合があります。したがって、buttonIndexをグリッド行の範囲内に保つためのチェックが行われます。

int buttonIndex = 0; 

private void button7_Click(object sender, EventArgs e) { 

    if (buttonIndex >= dataGridView1.Rows.Count || dataGridView1.Rows[buttonIndex].IsNewRow) 
    buttonIndex = 0; 

    if (dataGridView1.AllowUserToAddRows == true) { 
    if (dataGridView1.RowCount > 1) 
     textBox1.Text = dataGridView1.Rows[buttonIndex].Cells["Columnname"].Value.ToString(); 
    else 
     textBox1.Text = ""; 
    } else { 
    if (dataGridView1.RowCount > 0) 
     textBox1.Text = dataGridView1.Rows[buttonIndex].Cells["Columnname"].Value.ToString(); 
    else 
     textBox1.Text = ""; 
    } 
    buttonIndex++; 
} 
関連する問題