none
有辦法觸發datagridview內CheckBox的狀態改變事件嗎?? RRS feed

  • 一般討論

  • 各位好
    請問一下 我的datagridview內有個column,type為DataGridViewCheckBoxColumn
    請問我該如何抓到這個CheckBox的Checked事件呢???

    請各位不吝指教 謝謝
    2009年5月12日 上午 10:21

所有回覆


  •         private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
            {
                if (e.RowIndex >= 0 && e.ColumnIndex == 0)
                {
                    dataGridView1.EndEdit();
                    MessageBox.Show(dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString());
                }

            }

    http://www.dotblogs.com.tw/larrynung/
    2009年5月12日 上午 11:05
  • Jude13:
             另一個解法,用DataGridView.CurrentCellDirtyStateChanged 事件 加上 DataGridView.CellValueChanged 事件 來處理
    namespace DGVCellCheckTest
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            private DataTable myTable = new DataTable();
            private void Form1_Load(object sender, EventArgs e)
            {
                myTable.Columns.Add("V01");
                myTable.Columns.Add("V02");
                int i;
                for (i = 0; i <= 9; i++)
                {
                    DataRow myRow = myTable.NewRow();
                    myRow[0] = i;
                    myRow[1] = true;
                    myTable.Rows.Add(myRow);
                 }
                 dataGridView1.DataSource = myTable;
               
            }

            private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
            {
                if (dataGridView1.IsCurrentCellDirty)
                {
                    dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
                }

            }

            private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
            {
                if (e.RowIndex >= 0 && e.ColumnIndex == 1)

                {
                    MessageBox.Show("行:" + e.ColumnIndex.ToString() + " 列:" + e.RowIndex.ToString() + "變更Checked狀態"); 
                }
            }
        }
    }
    不過這方法好像比較囉唆.
    詳見 MSDN文件庫 [DataGridView.CurrentCellDirtyStateChanged 事件]

    2009年5月12日 下午 12:46
    版主
    1. 先將CheckBoxField轉成TemplateField
    2. 設定ItemTemplate中CheckBox.AutoPostBack = true
    3. 將第幾列的資訊隱藏在CheckBox.ToolTip屬性
    4. 於CheckBox_CheckedChanged事件中自ToolTip取回第幾列的資訊,以正確辨別哪個一列的CheckBox被Checked。

    ASPX程式碼片段:

    <asp:GridView ID="GridView1" runat="server" onrowdatabound="GridView1_RowDataBound">
        <Columns>
            <asp:TemplateField>
                <EditItemTemplate>
                    <asp:CheckBox ID="CheckBox1" runat="server" />
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:CheckBox ID="CheckBox1" runat="server" />
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>

    C# 程式碼片段:
    private int Index = 0;
    protected void CheckBox1_CheckedChanged(object sender,EventArgs e)
        {
            CheckBox chkbox = (CheckBox)sender;
            Response.Write(chkbox.ToolTip);
        }
    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                CheckBox chkbox = (CheckBox)e.Row.FindControl("CheckBox1");
                chkbox.ToolTip = Index.ToString();
                Index++;
            }
        }

    2009年5月13日 上午 01:32
  • 謝謝大大的回應 感恩喔

    2009年5月13日 上午 03:33