none
DataGridView的儲存格確認問題 RRS feed

  • 問題

  • 我的問題描述如下:

    1. 在 DataGridView 的儲存格中輸入資料後,必須在按另一儲存格,或換列後,前一儲存格的資料才會確認存入該儲存格。

    2. 如果DataGridView 的某一行儲存格,資料類型設定為核取方塊,用於被勾選或取消勾選選項。當使用者勾選或取消勾選該核取方塊後,若他沒有再去處理其它儲存格,而立即按儲存,將會造成核取方塊的勾選狀態失效。

    3.請問,該如何控制在 DataGridView 的儲存格中輸入資料後,隨即確認該儲存格的值,以使如勾選核取方塊之後,就同時確認該核取狀態。

     

    敬請指教,謝謝。

    2008年2月3日 下午 02:42

解答

  • 我這邊寫一個小程式來測試可以的...

    using System;
    using System.Data;
    using System.Data.SqlClient;
    using System.Windows.Forms;
     
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            private DataSet ds = new DataSet();
            private BindingSource bs = new BindingSource();
     
            private void Form1_Load(object sender, EventArgs e)
            {
                string strConn = @"Data Source=.\SQLEXPRESS;AttachDbFilename=""C:\NORTHWND.MDF"";Integrated Security=True";
                SqlConnection conn = new SqlConnection(strConn);
                SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM Products", conn);
                da.Fill(ds);
     
                bs.DataSource = ds.Tables[0];
                dataGridView1.DataSource = bs;
     
                bs.Filter = "Discontinued = true";
            }
     
            private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
            {
                if (dataGridView1.CurrentCell is DataGridViewCheckBoxCell)
                {
                    dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
                }
            }
     
            private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
            {
                int row = e.RowIndex, column = e.ColumnIndex;
     
                if (row >= 0 && column >= 0)
                {
                    MessageBox.Show(dataGridView1.Rows[row].Cells[column].Value.ToString());
                    bs.EndEdit();
                }
            }
        }
    }

    2008年2月4日 上午 06:35
  • 參考: Order of Validation Events

    The following identifies the order of validation, enter/leave and begin/end edit events. The EditMode is EditOnEnter.

    When moving from cell to cell (in the same row)

    1)       Cell Leave (old cell)

    2)       Cell Validating/ed (old cell)

    3)       Cell EndEdit (old cell)

    4)       Cell Enter (new cell)

    5)       Cell BeginEdit (new cell)

     

    When moving from one row to another you get:

    1)       Cell Leave (old cell), Row leave (old row)

    2)       Cell Validating/ed (old cell)

    3)       Cell EndEdit (old cell)

    4)       Row Validating/ed (old row)

    5)       Row Enter (new row)

    6)       Cell Enter (new cell)

    7)       Cell BeginEdit (new cell)


    2008年2月4日 下午 02:56

所有回覆

  • private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
    {
        if (dataGridView1.CurrentCell is DataGridViewCheckBoxCell)
        {
            dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
        }
    }
     
    private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
        int row = e.RowIndex, column = e.ColumnIndex;
     
        if (row >= 0 && column >= 0)
        {
            MessageBox.Show(dataGridView1.Rows[row].Cells[column].Value.ToString());
        }
    }

    試試看處理 CurrentCellDirtyStateChanged CellValueChanged 事件

    2008年2月3日 下午 03:23
  • 1.感謝前輩不吝教導,謝謝。

    2.延續上面的問題,再請問下列問題:

    a.CellValueChanged事件,會在啟動應用程式時就引發事件,這會造成開啟應用程式的困擾,是否可避過在啟動應用程式時引發這個事件。

    b.當DataGridView的某一欄位設定為CheckBoxCell ,且設有BindingSource.Filter = "檢查否=True",這可使在勾選核取方塊後,若核取方塊的值為True,即篩選出合乎條件的記錄。

    c.問題在於,勾選核取方塊或取消勾選核取方塊後,必須再按另一列資料列才會產生篩選效果,請問如何控制在勾選或取消勾選核取方塊後,隨即結束列編輯,並執行篩選工作

     

    敬請再指導,謝謝。

     

    2008年2月4日 上午 03:42
  • a. 所以我才有設定 row >=0 && column >= 0
    b. c.  在原程式碼 MessageBox 後 貼上 xxxxxBindingSource.EndEdit(); 試試看

    2008年2月4日 上午 05:29
  • 1.萬分感謝指導。

    2.我反覆試「在原程式碼 MessageBox 後 貼上 xxxxxBindingSource.EndEdit();」,但無法產生效果。

     

    敬請再指導,謝謝。

    2008年2月4日 上午 05:46
  • 我這邊寫一個小程式來測試可以的...

    using System;
    using System.Data;
    using System.Data.SqlClient;
    using System.Windows.Forms;
     
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            private DataSet ds = new DataSet();
            private BindingSource bs = new BindingSource();
     
            private void Form1_Load(object sender, EventArgs e)
            {
                string strConn = @"Data Source=.\SQLEXPRESS;AttachDbFilename=""C:\NORTHWND.MDF"";Integrated Security=True";
                SqlConnection conn = new SqlConnection(strConn);
                SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM Products", conn);
                da.Fill(ds);
     
                bs.DataSource = ds.Tables[0];
                dataGridView1.DataSource = bs;
     
                bs.Filter = "Discontinued = true";
            }
     
            private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
            {
                if (dataGridView1.CurrentCell is DataGridViewCheckBoxCell)
                {
                    dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
                }
            }
     
            private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
            {
                int row = e.RowIndex, column = e.ColumnIndex;
     
                if (row >= 0 && column >= 0)
                {
                    MessageBox.Show(dataGridView1.Rows[row].Cells[column].Value.ToString());
                    bs.EndEdit();
                }
            }
        }
    }

    2008年2月4日 上午 06:35
  • 辛苦了,有了這個例子,問題解決了,謝了。祝新年快樂。

    2008年2月4日 上午 07:33
  • 順便再請問:

    1.在 DataGridView 內點選資料列後,哪個事件是點選資料列後會引發的事件。

    2.若使用 RowEnter 做為點選資料列後所引發的事件,因它會在啟動應用程式時就會引發事件,這該如何避開,使不要在啟動應用程式時就引發事件。

     

    敬請指導,謝謝。

    2008年2月4日 下午 02:52
  • 參考: Order of Validation Events

    The following identifies the order of validation, enter/leave and begin/end edit events. The EditMode is EditOnEnter.

    When moving from cell to cell (in the same row)

    1)       Cell Leave (old cell)

    2)       Cell Validating/ed (old cell)

    3)       Cell EndEdit (old cell)

    4)       Cell Enter (new cell)

    5)       Cell BeginEdit (new cell)

     

    When moving from one row to another you get:

    1)       Cell Leave (old cell), Row leave (old row)

    2)       Cell Validating/ed (old cell)

    3)       Cell EndEdit (old cell)

    4)       Row Validating/ed (old row)

    5)       Row Enter (new row)

    6)       Cell Enter (new cell)

    7)       Cell BeginEdit (new cell)


    2008年2月4日 下午 02:56
  • 1.感謝指導。

    2.上列的事件大多能知道它的用途,但不會的是,如使用 RowEnter 做為點選資料列後所引發的事件,因它會在啟動應用程式時就引發事件,這該如何避開,使不要在啟動應用程式時就引發事件。

     

    敬請能指導這方面的作法,感激不盡,先謝了。

     

    2008年2月4日 下午 03:43
  • 這是另一個問題了...麻煩您另開主題問答...再另行回答...


    2008年2月4日 下午 04:14