- 題名: DataGridViewのCheck状態の変更
- 日時: 2009/12/17 1:55:41
- ID: 26073
- この記事の返信元:
- (なし)
- この記事への返信:
- [26092] Re[1]: DataGridViewのCheck状態の変更2009/12/18 11:29:10
- [26099] Re[1]: DataGridViewのCheck状態の変更2009/12/19 12:05:55
- ツリーを表示
お疲れ様です。 CellEndEditではいかがでしょうか? Public Class Form_CheckBoxColumnTest Inherits Form Dim WithEvents DataGridView1 As New DataGridView Protected Overrides Sub OnLoad(ByVal e As System.EventArgs) With Me.DataGridView1 .Columns.Add(New DataGridViewCheckBoxColumn) .Columns.Add(New DataGridViewTextBoxColumn) .RowCount = 10 .Dock = DockStyle.Fill End With Me.Controls.Add(Me.DataGridView1) MyBase.OnLoad(e) End Sub ' TextBoxCellに何か入力するとCheckedに変更する Private Sub DataGridView1_CellEndEdit(ByVal sender As Object, _ ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit With Me.DataGridView1 If .Columns(e.ColumnIndex).GetType Is GetType(DataGridViewTextBoxColumn) Then Dim checkboxcell As DataGridViewCell = .Item(0, e.RowIndex) If Convert.ToString(.Item(e.ColumnIndex, e.RowIndex).Value) <> "" Then checkboxcell.Value = True Else checkboxcell.Value = False End If End If End With End Sub End Class
■No26073に返信(しらいわさんの記事) > このチェックボックスは特定の条件を満たした行のチェックを行った場合に > 警告を出して、自動で外す。 これでどうでしょう。 using System; using System.Windows.Forms; using System.Data; using System.Drawing; public partial class Form1 : Form { public static void Main() { Application.Run(new Form1()); } DataGridView dgv = new DataGridView(); DataTable tbl = new DataTable(); DataColumn colID; public Form1() { colID = tbl.Columns.Add("ID", typeof(int)); tbl.Columns.Add("Check", typeof(bool)); tbl.Columns.Add("Name", typeof(string)); colID.ReadOnly = true; tbl.PrimaryKey = new DataColumn[] { colID }; tbl.Rows.Add(10, false, "色は匂へど"); tbl.Rows.Add(20, false, "散りぬるを"); tbl.Rows.Add(30, false, "我が世誰そ"); tbl.Rows.Add(40, true, "常ならむ"); tbl.Rows.Add(50, true, "有為の奥山"); tbl.Rows.Add(60, true, "今日越えて"); tbl.Rows.Add(70, false, "浅き夢見じ"); tbl.Rows.Add(80, false, "酔ひもせず"); dgv.AutoGenerateColumns = true; dgv.AllowUserToAddRows = false; dgv.Dock = DockStyle.Fill; dgv.DataSource = tbl; dgv.EditMode = DataGridViewEditMode.EditOnEnter; Controls.Add(dgv); Shown += delegate { dgv.AutoResizeColumns(); }; dgv.CurrentCellDirtyStateChanged += new EventHandler(dgv_CurrentCellDirtyStateChanged); } void dgv_CurrentCellDirtyStateChanged(object sender, EventArgs e) { Point cell = dgv.CurrentCellAddress; if (特定の条件(cell.X, cell.Y)) { if (dgv.IsCurrentCellDirty) { MessageBox.Show("警告"); // 値キャンセル dgv.RefreshEdit(); // 値確定 // dgv.CommitEdit(DataGridViewDataErrorContexts.Commit); } } } public bool IsCheckBoxColumn(int col) { return (dgv.Columns[col].Name == "Check"); } public bool 特定の条件(int colIndex, int rowIndex) { // ID が 40 未満のチェックボックス列ならば true DataGridViewRow row = dgv.Rows[rowIndex]; DataRowView rowView = (DataRowView)row.DataBoundItem; if (rowView == null || rowView.IsNew || !IsCheckBoxColumn(colIndex)) { return false; } else { return (int)rowView["ID"] < 40; } } }
分類:[.NET]
2009/12/17(Thu) 01:56:53 編集(投稿者)
はじめまして、いつも参考にさせて頂いております。
こちらの
DataGridViewの列にチェックボックスを表示する
http://dobon.net/cgi-bin/pc/tb.php/datagridview/datagridviewcheckboxcolumn.html
を参考にDataGridViewにチェックボックスが表示されるように実装しました。
このチェックボックスは特定の条件を満たした行のチェックを行った場合に
警告を出して、自動で外す。
という形にしたいのですがCurrentCellDirtyStateChangedイベント内で
DataGridView1.CurrentCell.Value = false;
としてみたのですがフォーカスが外れない限りチェックが外れない状態です。
上記の処理を実装する方法がありましたら、ご教授頂けますでしょうか
よろしくお願い致します。