• 締切済み

dataGridViewの値取得遅延について

vc++でdataGridViewの第1列にcheckBoxを設け、チェックの有無を取得しようとしています。 コードは、 for(int i = 0; i < totalLineNumber; i++){ Debug::Print("{0}", dataGridView1->Rows[i]->Cells[0]->Value->ToString()); } です。 ところが、チェックを変更しながら繰り返し実行すると、最後の変更が反映さずに、1アクション前の状態が帰ってきてしまいます。例えば、上から順に1つずつチェックを増やして、そのたびに実行すると、上から4行にチェックを入れた段階では、上から3行がTrueを返し、4行目以降がFalseを返すといった具合です。現在のチェックの状態を遅れなしに取得するには、どうすれば良いのでしょうか。

みんなの回答

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

>Form1_DragDrop()の中で実行しています。 であれば……「チェックボックスをクリックする」=>「チェックボックスの状態が変化する」=>「変化した状態を描画する」の一連の処理は終わっているハズなので…現在の状態が取得できているはずだと思われますが…。 # 私が試した「ボタンを押して現在の状態を取得」と同じようなモノでしょう。 # ファイルのドロップでそのDataGridViewの内容を変更していなければ…ですが。 >実は、もう一つ不可解なことがありました。それは、実行中にある列にチェックをいれると、別の列のチェックが消えたり、また、ある列のチェックを外すと別の列にチェックが現れたりする現象です。 DataGridViewに対して何かしら操作を行っているところがあるのではないでしょうか? DataSourceにバインドしている場合はそちらのデータを操作した場合でも反映された…ような。 # C#でしたけどね。 C++/CLIでポインタとか使えるのか不明ですが、ふつ~のC/C++だとポインタの扱い間違えると不可解な挙動することはありますね。

softwarelearner
質問者

お礼

有難うございます。 全く不可解な状態です。 仕方がないので、プロジェクトを立て直して、同じ状態が再現するかどうか試してみようと思っています。次にプログラムに触れるのが月曜日なので、また何かお分かりの点がありましたら、ご教示ください。

softwarelearner
質問者

補足

質問者のsoftwarelearnerです。 次の点が明らかになりました。 (1)プロジェクトを1から作り直しても同じ結果となりました。 (2)ドラッグ&ドロップからではなく、ボタン等から呼び出せば正しい結果が得られました。 (3)ドラッグ&ドロップからボタンのメソッドを呼び出してもうまくいきませんでした。 (4)ドラッグ&ドロップとボタンの違いは不明です。 とりあえず、ボタンから起動することにします。 いろいろと有難うございました。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

C++/CLIは触っていないので細かいところは不明ですが…。 掲示されたコードはどこで実行しているのでしょうか? C#でフォームにDataGridViewとButtonを追加して、 Buttonのイベントハンドラで実行した場合は普通に表示されましたが…。 DataGridViewのCellContentClickイベントハンドラでは変更前のもの…でしたね。 まぁ、MSDNにそう記載されていたりしますが。 # http://msdn.microsoft.com/ja-jp/library/system.windows.forms.datagridview.cellcontentclick%28v=vs.100%29.aspx の解説に。 CellClickでも同様。 # http://msdn.microsoft.com/ja-jp/library/system.windows.forms.datagridview.cellclick%28v=vs.100%29.aspx の解説に。

softwarelearner
質問者

お礼

有難うございます。 掲載したコードは、 Form1_DragDrop()の中で実行しています。 ドラッグ&ドロップしたファイルに対して、dataGridViewで指定した処理をするのが目的です。dataGridViewの2列目には処理メニューを列挙してあります。 実は、もう一つ不可解なことがありました。それは、実行中にある列にチェックをいれると、別の列のチェックが消えたり、また、ある列のチェックを外すと別の列にチェックが現れたりする現象です。これは、一時的に起こって、その後再現していません。なにか、プログラムに不安定な要因があるのでしょうか?

関連するQ&A

  • DataGridViewについて

    Fom1のDataGridViewから選択した行のデータをForm2のDataGridViewに渡し、Form2で編集しFom1に反映せると、どの行のデータも1行目に入ってしまいます。 どのようなコードで解決できますか? 【Form1】 private void DataGridView1_SelectedRowsDoubleClick(Object sender, MouseEventArgs e) { // Form2を作成し、親フォームとしてForm1を設定する Form2 f2 = new Form2(); f2.Owner = this; // 親フォームを設定 // 選択行のデータを渡す f2.SetRowData(dataGridView1.SelectedRows, dataGridView1); // Form2を表示する f2.Show(); } /// <summary> /// 選択行のデータを更新するメソッド public void UpdateSelectedRowData(int rowIndex, string editedData1, string editedData2, string editedData3) { // データソースが DataTable の場合のみ処理を実行する if (dataGridView1.DataSource is DataTable dt && dt.Rows.Count > rowIndex) { // データ行を取得する DataRow dataRow = dt.Rows[rowIndex]; // 編集データを新しいデータ行にセットする dataRow["date"] = editedData1; dataRow["name"] = editedData2; dataRow["week"] = editedData3; } } } } 【Form2】 public void SetRowData(DataGridViewSelectedRowCollection rows, DataGridView dataGridView)  { //データテーブルの作成 DataTable dt = createData(); foreach (DataGridViewRow r in rows) { //1列目~3列目を取り出す string s1 = r.Cells[1].Value.ToString(); // 日付 string s2 = r.Cells[2].Value.ToString(); // 名前 string s3 = r.Cells[3].Value.ToString(); // 曜日 dt.Rows.Add("2023年", s1, s2, s3); //日付順に昇順に表示する dt.DefaultView.Sort = "日付 ASC"; } //一覧を表示する dataGridViewDisp2(dt); } // 編集後のデータを保持するためのプロパティ public string EditedData1 { get; set; } public string EditedData2 { get; set; } public string EditedData3 { get; set; } /// 更新ボタンの処理 private void savebtn_Click(object sender, EventArgs e) { // 親フォーム Form1 をForm1に指定する Form1 form1 = this.Owner as Form1; if (form1 != null) { // Form1のDataGridViewのデータソースを取得する DataTable dt = form1.dataGridView1.DataSource as DataTable; if (dt != null) { // dataGridView2の各行を処理する foreach (DataGridViewRow row in dataGridView2.Rows) { // 新規行はスキップする if (row.IsNewRow) continue; // 編集されたデータを取得する string editedData1 = row.Cells[1].Value.ToString(); string editedData2 = row.Cells[2].Value.ToString(); string editedData3 = row.Cells[3].Value.ToString(); // 選択された行のインデックスを取得する int rowIndex = row.Index; // 親フォーム Form1 の UpdateSelectedRowData メソッドを呼び出す form1.UpdateSelectedRowData(rowIndex, editedData1, editedData2, editedData3); } } } // 現在のフォームを閉じる this.Close(); } } }

  • DataGridViewで再表示すると変更不可にならない

    Visual Basic 2008 にて開発していますがDataGridViewについて質問させて下さい。 DataGridViewのデータ表示は、検索結果をDataTableに格納し、 そのDataTableをDataSourceに設定する方法で行っています。 DataGridView内にはチェックボックスがあり、 そのチェックボックスは条件によってReadOnly = Trueにて変更不可にして表示しています。 最初の表示は問題なく条件に合えば ReadOnly = Trueにて変更不可になり表示してくれますが、 再表示(DataTableをDataSourceに再代入)すると条件に合っているのにReadOnly = Trueが効かず、 チェックボックスが変更可能となって表示してしまいます。 ReadOnly=True にする方法は、DataGridView の件数を取得し、 jjCnt = 0 Do Until jjCnt >= ggCnt   If DataGridView1.Rows(jjCnt).Cells(88).Value.ToString() = "1" Then DataGridView1.Rows(jjCnt).Cells(0).ReadOnly = True End If jjCnt = jjCnt + 1 Loop で行っています。 何故、再表示だと変更不可にならないのか解らずご教授願いたく宜しくお願い致します。

  • DataGridViewから値取得

    DataGridViewにボタンと項目2つが配置されています。 DataGridView1 DataGridView1.Columns("btn").HeaderText = "ボタン" DataGridView1.Columns("item1").HeaderText = "アイテム1" DataGridView1.Columns("item2").HeaderText = "アイテム2" ボタンを押すと、押した行のレコードを取得したいです。 ボタンのところを押下すると、 イベントハンドラで何行目か分かるサンプルをネットで見つけました。 惜しいですが、やりたいのと少し違いました。 'CellContentClickイベントハンドラ Private Sub DataGridView1_CellContentClick(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick Dim dgv As DataGridView = CType(sender, DataGridView) Dim test_item1 As String Dim test_item2 As String ' "btn"列ならば、ボタンがクリックされた If dgv.Columns(e.ColumnIndex).Name = "btn" Then MessageBox.Show((e.RowIndex.ToString() + "行のボタンがクリックされました。")) End If ' ここに押された行のitem1の値をセット ' test_item1 = (A) ' ここに押された行のitem2の値をセット ' test_item2 = (B) End Sub (A)、(B)に何を記述すれば値を取得できますか?

  • DataGridViewで、選択した行の値を取得したい。

    VB2005環境です。 VB2005で、選択した行の、特定の列から値を取って、 テキストボックスに出力したいと思っています。 Itemプロパティかと思い、 TxtBox1.Text = Me.DataGridView1.Item _(0,Me.DataGridView1.CurrentRow.Index).ToString と記述してみました。1列目の、選択した行と交わるセルの 値が取れるかと思いきや、うまく取得できません。 方法を教えていただけないでしょうか? よろしくお願いします。

  • C# datagridview データバインド系

    datagridviewのデータバインドについて教えてください. 今,下記のプログラム(一部)を組んで処理を行おうとしていますがうまくいかないため 何が悪いのか教えて頂けないでしょうか? 今datagridviewをデータテーブルにバインドしています. for (j = t; j < R - 1; j++) { object Ti = this.dataGridView1.Rows[j].Cells[0].Value; object Tibf = this.dataGridView1.Rows[j + 1].Cells[0].Value; string TiS = Convert.ToString(Ti); string TiSbf = Convert.ToString(Tibf); # region // シリアル値化 long serial = DateTime.Parse(TiS).ToBinary(); long serialbf = DateTime.Parse(TiSbf).ToBinary(); long parsesum = serial + Oneparse; if (serialbf != parsesum) { dataGridView1.Rows.Insert(j + 1, 1); // シリアル値から復元 DateTime dtm = DateTime.FromBinary(parsesum); string s = Convert.ToString(dtm); // 指定した書式で日付を文字列に変換する string stPrompt1 = dtm.ToString("yyyy/M/d H:mm"); this.dataGridView1.Rows[j + 1].Cells[0].Value = stPrompt1; } } 簡単に言うと,行を追加したいのですが,forの前でデータソースをnullにすると object Ti = this.dataGridView1.Rows[j].Cells[0].Value;でエラー if (serialbf != parsesum)の後にすると dataGridView1.Rows.Insert(j + 1, 1);でエラー が起こります.どちらの場合も下記のエラーが出ます. インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。 パラメーター名: index 本当に困っています. よろしくお願いいたします.

  • C# .NET DataGridView の行を追加するとデータが消える。

    すぐ下に先ほど書いた質問がありますが、こちらに難点か追記してあります。下の質問は後ほど消します。(何でか、今現在消せないそうなので。) 環境 WindowsXP SP2 VisualStudio.NET 2005 C# テストプログラムで、こんなコードを書きました。 private void button1_Click(object sender, EventArgs e) { int iMaxCnt; dataGridView1.Rows.Add(1); iMaxCnt = dataGridView1.RowCount ; dataGridView1.EndEdit(); dataGridView1.Rows[iMaxCnt-1].Cells[0].Value = "たちつてと"; dataGridView1.Rows[iMaxCnt-1].Cells[1].Value = "なにぬめの"; dataGridView1.Rows[iMaxCnt-1].Cells[2].Value = "はひふへほ"; dataGridView1.EndEdit(); } ボタンのクリックイベントなので、これを何度か実行すると、DataGridView の一番下の行だけにデータが表示されてしまいます。(以前のボタン押下時に記入されたデータが消えてしまい、データの変更が確定されていないように見えます。) なぜなんでしょう?

  • DataGridView からの値取得に関して

    教えて下さい。 DataGridView の値を取得して、それを単純に変数に格納しようとしていますが、 DataGridView に何も表示させていない状態で、取得をしようとした場合、以下のような エラーとなってしまいます。 《エラー内容》  オブジェクト参照がオブジェクト インスタンスに設定されていません。 値が何も入っていない為、当然と言えば当然ですが、、、 その為、それを回避する為にNull判定等を加えたいと考えていますが、そもそも そのNull判定でも同じエラーとなってしまいます。 《記述内容》 Dim smsg As String If GRD_マスタ.CurrentRow.Cells(0).Value = "" Then ← ここで既にエラー smsg = "存在しません。" MessageBox.Show(smsg, "TEST", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) Else _kekka = GRD_マスタ.CurrentRow.Cells(0).Value End If 上記の判定方法の記述の仕方がおかしいでしょうか、、、 初歩的な質問で申し訳ありませんが教えて下さい。 よろしくお願いします。

  • Form1からForm2へ値渡しの際

    DataGridViewでForm1で選択した行の1列目と3列目だけを、Form2のDataGridViewに表示するコードを書いています。 DataGridViewでForm1からForm2へ値渡しの際、複数行選択→ダブルクリックするとForm2が1行ずつ、行の選択数分出てしまいます。 Form2のDataGridViewに選択数分の行(例えば3行選択ならForm2のDataGridViewの画面に3行)出るようにしたいです。 ご教授お願い致します。 【Form1】 private void DataGridView1_SelectedRowsDoubleClick(Object sender, MouseEventArgs e) { //選択した行の取得 foreach (DataGridViewRow r in dataGridView1.SelectedRows) { //詳細画面を開く Form2 f2 = new Form2(); //選択行をForm2に渡す f2.setRowData(r); //Form2を開く f2.Show(); } } 【Form2】 public void setRowData(DataGridViewRow r) { //1列目と3列目を取り出す string s1 = r.Cells[1].Value.ToString(); string s2 = r.Cells[3].Value.ToString(); // データを作成する DataTable dt = createData(); //データテーブル(DGVの中身)にいれる dt.Rows.Add("2023年",s1,s2); //一覧を表示する dataGridViewDisp2(dt); }

  • DataGridView 複数選択で行番号の取得

    Visual Basic 2008 を使っています。 DataGridViewで複数の行を選択したとき、それぞれが何行目なのかを取得するにはどうしたらいいでしょうか? 具体的には、複数選択されている行の0列目の値をテキストボックスに表示するという動作を行いたいです。 自分で書いたコードをペーストしておきます。 Dim count As Integer = Me.DataGridView1.SelectedRows.Count For count = 0 To count - 1 Dim test As String test = Me.DataGridView1.Rows(?何行目か).Cells(0).Value Me.TextBox4.Text = test & "が選択されています。" & vbCrLf & zenkai Dim zenkai As String = Me.TextBox1.Text Next

  • gridviewでの高さの取得方法

    gridviewの各行の高さを取得する方法を教えていただけないでしょうか? gridview.Rows(0).Height.ToStringを行っても、空白になってしまいます。 gridview.Rows(0).Cells(0).Height.ToStringでも同じ結果でした。 申し訳ございませんが、よろしくお願いします。

専門家に質問してみよう