DataGridViewセル編集の値設定について

このQ&Aのポイント
  • VB.NETのDataGridViewで、セル編集完了後に値を設定する方法について質問です。
  • 現在、セル編集後に値を正常に設定できない状況にあります。
  • CellParsingイベントで値を設定してもセルに値が登録されないです。解決方法を教えてください。
回答を見る
  • ベストアンサー

DataGridViewのセル編集完了後に値を設定するには

VB.NETのDataGridViewについて質問です。 セル編集完了後に、編集した値が不正であるならその値をセル編集前に戻すというプログラムを作成しています。 しかし、現在値を正常に戻すことが出来ずに困っています。 現在は下記のように作成しています。 (1)CellBeginEditイベントを使用して、セル編集前の段階の値を「cellItem」変数に保存する (2)CellParsingイベントを使用して、保存した値で復元する。 (2)の段階で、下記の「cellItem」変数には値が入っているにも関わらず、セルに値が登録されていません。 尚、ボタンクリックイベント等で dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = cellItem を行うと、正常に値が登録されました。 セル編集完了後に値を戻すにはどのようにすれば良いのでしょうか? お分かりになる方がいらっしゃいましたら宜しくお願いします 'セル編集開始前 Private Sub dgv_CellBeginEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles dgv.CellBeginEdit cellItem = dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Value End Sub 'セル編集完了後 Private Sub dgv_CellParsing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellParsingEventArgs) Handles dgv.CellParsing dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = cellItem End Sub

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

CellValidated でなら書き換えられるみたいですよ。

guccyonn
質問者

お礼

出来ました 予想外に簡単にできて少し驚きました ありがとうございました

関連するQ&A

  • DataGridViewのセルのItem設定につい

    DataGridView内にコンボボックスのカラムを設定しました。 下記のサイトを参考にしました。 http://dobon.net/vb/dotnet/datagridview/comboboxdropdownstyle.html 入力した内容をカラム単位ではなく、セル単位で追加したかったため、 CellValidatingメソッドを下記の通り一部変更しました。 //CellValidatingイベントハンドラ private void DataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) { DataGridView dgv = (DataGridView)sender; //該当する列か調べる if (dgv.Columns[e.ColumnIndex].Name == "sComboColumn" && dgv.Columns[e.ColumnIndex] is DataGridViewComboBoxColumn) { //DataGridViewComboBoxColumn cbc = // (DataGridViewComboBoxColumn)dgv.Columns[e.ColumnIndex]; // // ↓cellへ変更 // DataGridViewComboBoxCell cbc = (DataGridViewComboBoxCell)dgv.Rows[e.RowIndex].Cells[e.ColumnIndex]; //コンボボックスの項目に追加する if (!cbc.Items.Contains(e.FormattedValue)) { cbc.Items.Add(e.FormattedValue); } //セルの値を設定しないと、元に戻ってしまう dgv[e.ColumnIndex, e.RowIndex].Value = e.FormattedValue; } } コンボボックスに入力し、EnterやTabを押したタイミングでコンボボックスのリストに、 入力した文字列が追加されます。また、入力した文字列がセルに表示された状態になります。 しかし、その後同じセルに文字列を入力した場合、リストに文字列が追加されますが、 セルに表示される文字列はその前に入力された文字列のままです。 どのようにすれば入力後のセルの内容を設定できるかご存じの方がいれば ご教授いただきたいです。

  • 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で1行全てを選択状態にするには

    VB.NETのDataGridViewについての質問です。 DataGridViewでセルを選択した時に、そのセルの行を全て選択したいのですが、その方法がわからず困っています。 単純な方法を試してみたのですが Private Sub DataGridView_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView.CellClick DataGridView.CurrentCell = DataGridView.Rows(e.RowIndex).Cells(-1) End Sub この方法ですと、Cells(-1)の所で境界外となって上手くいかないようです。 何か良い方法がありましたら、ご教授願います

  • イベント内で別イベントを呼ぶ方法

    早速質問させていただきます。 Form上にDataGridView(dgv)があります。 dgvのセルをマウスでダブルクリックした時に処理を入れております。 Private Sub dgv_CellDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgv.CellDoubleClick   If e.RowIndex = -1 Then     Exit Sub   End If   '//処理 End Sub このdgv上でEnterキーを押した際に、ダブルクリックしたのと同じ処理を 行いたいのですが、このような場合、どのような実装をするのが一般的なのでしょうか? 例えば、下記の様にCall dgv_CellDoubleClick(sender, e)をするとEventArgsが合わないためエラーになってしまいます。 適切な方法をご教授お願い致します。 Private Sub dgv_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles dgv.KeyDown   If e.KeyCode = Keys.Enter Then     Call dgv_CellDoubleClick(sender, e)   End If End Sub

  • VB2005 Datagridview の仮想モードでメモリリーク

    VB2005にてDatagridviewの仮想モードを実装しています。 DataGridviewを全件ループ処理する場合にメモリが増加します。完了してもそのままメモリが減りません。これを回避する方法がありますか?CellValueNeededはメモリを消費し続けるものなのでしょうか。 実際のプログラムでは件数が多い場合にメモリの消費が止まらずメモリ不足に陥ります。 以下は単純なコードにしたサンプルです。これでもデバッグモードで動かすと起動時20Mくらいのメモリ消費がループ処理時に100Mくらいにに増えます。 ※実際の処理でバインドしているデータ(datatable等)の方をループさせるという代替案がありますが、今回はdatagridviewから行った結果のメモリ不足についてご教授いただければと思います。 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load With Me.DataGridView1 .Columns.Add("Column1", "列1") .Columns.Add("Column2", "列2") .Columns.Add("Column3", "列4") .Columns.Add("Column4", "列4") .Columns.Add("Column5", "列5") .Columns.Add("Column6", "列6") .Columns.Add("Column7", "列7") .VirtualMode = True .RowCount = 100000 End With End Sub Private Sub DataGridView1_CellValueNeeded(ByVal sender As Object, _ ByVal e As System.Windows.Forms.DataGridViewCellValueEventArgs) _ Handles DataGridView1.CellValueNeeded e.Value = e.RowIndex.ToString & "," & e.ColumnIndex.ToString End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click For i As Integer = 0 To DataGridView1.Rows.Count - 1 DataGridView1.Rows(i).Cells(1).Value = DataGridView1.Rows(i).Cells(2).Value Next MsgBox("終了") End Sub

  •  DataGridViewとHScrollBarのバーの幅を合わせる

     DataGridViewとHScrollBarのバーの幅を合わせる  今晩は,質問させていただきます.どうぞよろしくお願いいたします.  HScrollBarでDataGridViewを連動させております。 DataGridView内のセル幅の変更に伴いバーの大きさが変更された際、 HScrollBarのバーの大きさもこれと同じにしたいのでございますが、 どのプロパティにどの数字を入れてやればよいのかが分からず、 1ヶ月ほど悩んでおりますorz  ためしに↓のようにコーディングいたしましたが、、、   Private Sub DGV1_ColumnWidthChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewColumnEventArgs) _     Handles DGV1.ColumnWidthChanged     With HScrollBar1       .Minimum = 0       .Maximum = (DGV1.Columns(0).Width + DGV1.Columns(1).Width _            + DGV1.Columns(2).Width + DGV1.Columns(3).Width _            + DGV1.Columns(4).Width + DGV1.Columns(5).Width)             '↑例えばColumnが0~5まである場合でございます。             'おそらく「.Maximum」に何か入れるのでは、、と              '推測している次第でございますが。。。     End With   End Sub ↑この場合、HScrollBarの幅がDataGridViewより小さくなったり してしまい、その状態のままHScrollBarを動かしてしまいますと、 DataGridViewを連動させることができずエラーになってしまいます。  以下、必要ないかもしれませんが、HScrollBarとDataGridViewを 連動させているコードでございます。   Private Sub HScrollBar1_Scroll(ByVal sender As Object, ByVal e As System.Windows.Forms.ScrollEventArgs) _     Handles HScrollBar1.Scroll     DGV1.FirstDisplayedScrollingColumnIndex = e.NewValue       '↑ここでHScrollBarから大きい値が入ってしまい,       ' エラー「指定された引数は、有効な値の範囲にありません」になります。   End Sub  何かよい方法がございましたら,是非ともアドバイスいただきたくお願いいたします.  もしお詳しい方がいらっしゃいましたら,どうぞよろしくお願いいたします.

  • DataGridViewの値を別フォームに

    こんにちは。 1つ教えて頂けないでしょうか。 Form1にDataGridViewがあり、どれか1行ダブルクリックすると Form2にForm1のDataGridViewの7列目の値の条件で抽出した結果を Form2のDataGridViewに表示したいのです。 Form1からの受け渡しデータはForm2のテキストボックス(条件)に表示させ 受け渡されて来たときは表示ボタンをクリックしなくてもForm2の DataGridViewは表示したいのです。 それぞれのFormは作成し、Form1は Private Sub dgv_CellDoubleClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgv.CellDoubleClick Dim f As New Form2 f.txt条件 = Me.DataGridView.SelectedRows(0).Cells(7).Value f.ShowDialog() End Sub とコーディングしました。 Form2は表示されるのですが、データの受け渡しができていないし f.txt条件 = Me.DataGridView.SelectedRows(0).Cells(7).Valueの部分でキャストできませんのエラーに なります。 DataGridViewの選択した値を別のフォームに渡し、そのまま別フォームのDataGridViewを表示させたいのですが。 わかる方おられましたら、教えて頂けないでしょうか。 大変申し訳ありませんが、どうぞよろしくお願いします。

  • DataGridViewの特定のセルで選択状態を保ちたい VB2005

    DataGridViewの件で質問したいのですが。 よろしくお願いします。 VB2005で、DataGridViewの特定のセルでカーソルがとどまる(選択状態)ようにしたいのですが 思ったように動いてくれません。例えば、下のようなDataGtridViewがあったとして, 例 ------------------ |ID | X | Y | ------------------ |001| 100 | | ------------------ |002| 150 | | ------------------ |003| 105 | | ------------------ ID が002の行で、Y列のセルにカーソルが入りXと違う数を入力したら、メッセージを 表示させて、そのセルにカーソルがとどまる処理を作りたいのですが。下の行のセルに 移動してしまいます。  DataGridView_CellEndEditイベントやDataGridView1_CellValueChangedなどで カーソルがとどまる処理をしているつもりなのです下の行に移動してしまいます。 DataGridViewの初期設定の問題でしょうか? Private Sub DataGridView1_CellValueChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged Dim DgvRow As Integer '行をセット DgvRow = e.RowIndex ' X と Yが異なれば、メッセージ表示 If DataGridView1("X", e.RowIndex).Value <> DataGridView1("Y", e.RowIndex).Value Then MsgBox("X <> Y", MsgBoxStyle.OkOnly) Me.DataGridView1.CurrentCell = Me.DataGridView1("Y", DgvRow) ' これも駄目だった ↓ 'Me.DataGridView1.CurrentCell = Me.DataGridView1("Y", e.RowIndex - 1) End If End Sub アドバイスいただけたら幸いです。よろしくお願い致します。 開発環境 VB2005 Visual Studio 2005 Standard Edition(SP1) Windows XP Pro SP2

  • DataGridViewで右寄せ左寄せが反映されない

    新規フォームにDataGridViewを追加して、 Loadイベントに以下のコードを追記したのですが、 Alignmentの部分が正しく反映されません。 1行目は左寄せ、2行目は右寄せにしたいのですが 実際は1行目2行目ともに右寄せになります。 どのようにコーディングすれば個別に設定できるのでしょうか? Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim dt As New DataTable dt.Columns.Add("AccCode") dt.Columns.Add("AccName") dt.Rows.Add(dt.NewRow()) dt.Rows(0)("AccCode") = String.Empty dt.Rows(0)("AccName") = "てすとA" dt.Rows.Add(dt.NewRow()) dt.Rows(1)("AccCode") = String.Empty dt.Rows(1)("AccName") = "てすとB" Me.dgv.DataSource = dt ' コードのテキストを右寄せ dgv.Columns("AccName").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight dgv(0, 0).Style.Alignment = DataGridViewContentAlignment.MiddleLeft dgv(0, 1).Style.Alignment = DataGridViewContentAlignment.MiddleRight End Sub

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

    開発初心者で困っております。 VisualBasic2005、SQL Server2005Expressで開発しています。 DataGridViewのToolStripでフィルターを掛けたいのですが、フィルタの実行をすると、Dgvで行っているカラム1+カラム2の計算をしているSubプロシージャで”オブジェクト参照がオブジェクト インスタンスに設定されていません。”というエラーが出て中断します。 下記にソースを記載します。 (ToolStripフィルタ実行)----------------------------------------- Private Sub FillByDivToolStripButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FillByDivToolStripButton.Click If cmbDiv.Text <> "" Then Try Me.T_payscheduleTableAdapter.FillByDiv(Me.MoPDataSet.t_payschedule, cmbDiv.Text) ・・・ (Dgvの計算部分)------------------------------------------------- Private Sub T_payscheduleDataGridView_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles T_payscheduleDataGridView.SelectionChanged Dim iRow As Integer =Me.T_payscheduleDataGridView.CurrentCell.RowIndex() ←ここでエラー発生!! Dim iCol As Integer=Me.T_payscheduleDataGridView.CurrentCell.ColumnIndex() ・・・ ------------------------------------------------------------- エラーMsgを手掛かりに色々調べてはいるのですが解決の糸口がつかめません。よろしくお願いします。

専門家に質問してみよう