none
入力した直後のデータを取得する-DataGridView RRS feed

  • 質問

  • DataGridViewのセルに入力した直後の時点で入力データを取得したいと思い、CellLeaveイベントで次のようにテストコードを書いてみましたが、思い通りにはなりません。

    Code Snippet

    private void dataGridView1_CellLeave(object sender, DataGridViewCellEventArgs e)
    {
         string Name = "";


         //ここがマズイ

         Name = dataGridView1[e.ColumnIndex, e.RowIndex].value;
         dataGridView1[e.ColumnIndex + 1, e.RowIndex].Value = Name;

    }

     

     

    セル値の取得の仕方がまずいので、思いつくのを試してみました。

    Name = dataGridView1[e.ColumnIndex, e.RowIndex].tostring();
    Name = dataGridView1[e.ColumnIndex, e.RowIndex].value.tostring();

    当然のことですが、どれも失敗。

     

    セル値を正しく取得する方法をお教え願います。

     

     

    2009年1月24日 9:48

回答

  •  zen73 さんからの引用

    DataGridViewのセルに入力した直後の時点で入力データを取得したいと思い、CellLeaveイベントで次のようにテストコードを書いてみましたが、思い通りにはなりません。

    どの様な結果を望んでいて、

    どの様に上手くいかないのでしょうか?

     

     zen73 さんからの引用

    セル値の取得の仕方がまずいので、思いつくのを試してみました。

    Name = dataGridView1[e.ColumnIndex, e.RowIndex].tostring();
    Name = dataGridView1[e.ColumnIndex, e.RowIndex].value.tostring();

    当然のことですが、どれも失敗。

    エラーが出るのであれば、

    そのエラーメッセージに従って修正しましょう。

     

    Code Snippet

    if (dataGridView1[e.ColumnIndex, e.RowIndex].Value == DBNull.Value)
        dataGridView1[e.ColumnIndex + 1, e.RowIndex].Value = DBNull.Value;
    }
    else
    {
        Name = dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString();
        dataGridView1[e.ColumnIndex + 1, e.RowIndex].Value = Name;
    }

     

    あと、CellEndEdit イベントで処理する方がよいかも。

     

    MSDN

        DataGridView

    CellEndEdit イベント

    2009年1月24日 13:01
  •  zen73 さんからの引用

    Name = dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString();
    とすると、

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

    とのエラーなってしまい、対処の仕方がわからず途方に暮れています。

     

    karashimaさんが書かれているようにCellEndEditイベントでうまくいくと思いますが、上記の結果はCellEndEditイベントに書かれた結果なのでしょうか?

    そうであれば、どこでそのエラーが発生しているのかを絞り込むことが先決です。このエラーが出た時のe.ColumnIndex, e.RowIndexはいくつになっているのでしょうか? エラーメッセージから推測すると、これらのインデックスが指し示すセルが無いように思えます。

     

    また、少し本件からは外れますが、CellValidatingイベントを併用することも考えられます。エラーチェックをしてから名前を加工するような場合は役立つでしょう。

     

    DataGridViewのセルに入力された値が正しいか確かめる
    http://dobon.net/vb/dotnet/datagridview/cellvalidating.html

    2009年1月25日 1:20
    モデレータ
  • > 「オブジェクト参照がオブジェクト インスタンスに設定されていません。」

    > とのエラーなってしまい、対処の仕方がわからず途方に暮れています。

     

    依然として CellLeave イベントを使用しているのでは? そのタイミングで
    は Value は書き直す前の値になっているということを理解されているでしょ
    うか?

    2009年1月25日 5:05
  • すべての返信

    •  zen73 さんからの引用

      DataGridViewのセルに入力した直後の時点で入力データを取得したいと思い、CellLeaveイベントで次のようにテストコードを書いてみましたが、思い通りにはなりません。

      どの様な結果を望んでいて、

      どの様に上手くいかないのでしょうか?

       

       zen73 さんからの引用

      セル値の取得の仕方がまずいので、思いつくのを試してみました。

      Name = dataGridView1[e.ColumnIndex, e.RowIndex].tostring();
      Name = dataGridView1[e.ColumnIndex, e.RowIndex].value.tostring();

      当然のことですが、どれも失敗。

      エラーが出るのであれば、

      そのエラーメッセージに従って修正しましょう。

       

      Code Snippet

      if (dataGridView1[e.ColumnIndex, e.RowIndex].Value == DBNull.Value)
          dataGridView1[e.ColumnIndex + 1, e.RowIndex].Value = DBNull.Value;
      }
      else
      {
          Name = dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString();
          dataGridView1[e.ColumnIndex + 1, e.RowIndex].Value = Name;
      }

       

      あと、CellEndEdit イベントで処理する方がよいかも。

       

      MSDN

          DataGridView

      CellEndEdit イベント

      2009年1月24日 13:01
  • 私が最終的にやろうとしていることは、DataGridViewの[氏名列]のセルに氏名が入力された直後(フォーカスが移動した/氏名が確定した)に、この氏名を文字列変数Nameに取り込み、次にNameを

    山田  太郎   → 山 田  太 郎

    大田  博     → 大  田      博

    大河原  英彦 → 大河原 英彦

    というように加工して、元のセル位置に表示しなおそうとしています。

    (このように文字列を加工するクラスはできております)

     

    とりあえずは、Nameにきちんととりこまれているかどうかを確認しようとしているのですが

    Name = dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString();
    とすると、

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

    とのエラーなってしまい、対処の仕方がわからず途方に暮れています。

     


     

     

     

    2009年1月24日 20:49
  •  zen73 さんからの引用

    Name = dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString();
    とすると、

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

    とのエラーなってしまい、対処の仕方がわからず途方に暮れています。

     

    karashimaさんが書かれているようにCellEndEditイベントでうまくいくと思いますが、上記の結果はCellEndEditイベントに書かれた結果なのでしょうか?

    そうであれば、どこでそのエラーが発生しているのかを絞り込むことが先決です。このエラーが出た時のe.ColumnIndex, e.RowIndexはいくつになっているのでしょうか? エラーメッセージから推測すると、これらのインデックスが指し示すセルが無いように思えます。

     

    また、少し本件からは外れますが、CellValidatingイベントを併用することも考えられます。エラーチェックをしてから名前を加工するような場合は役立つでしょう。

     

    DataGridViewのセルに入力された値が正しいか確かめる
    http://dobon.net/vb/dotnet/datagridview/cellvalidating.html

    2009年1月25日 1:20
    モデレータ
  • > 「オブジェクト参照がオブジェクト インスタンスに設定されていません。」

    > とのエラーなってしまい、対処の仕方がわからず途方に暮れています。

     

    依然として CellLeave イベントを使用しているのでは? そのタイミングで
    は Value は書き直す前の値になっているということを理解されているでしょ
    うか?

    2009年1月25日 5:05
  •  SuferOnWww さんからの引用

    依然として CellLeave イベントを使用しているのでは? 

    そうなのでした。CellEndEditイベントで書き直しましたら、すべてがうまくいき

    氏名の均等配置もできました。

     SuferOnWww さんからの引用

    そのタイミングでは
    Value は書き直す前の値になっているということを理解されているでしょ
    うか?

    理解はしていませんでした。ただやみくもにこれが使えそうだというので使ってみただけでした。

    お恥ずかしい限りです。

     

    karashimaさん、trapemiyaさん、SuferOnWwwさん、どうもありがとうございました。

     

     

    2009年1月25日 6:23