none
如何控制DataGridView不要執行事件 RRS feed

  • 問題

  • 各位先進們好

    我的程式內用了2DataGrid

    1個調出採購單的資料

    在點擊第1DataGrid的某筆資料時讓第2DataGrid調出此生產廠商的資料

    簡化程式如下(簡單表達,先不顧慮sql injection問題)

    Dim DA,DA1 As New SqlClient.SqlDataAdapter
    Dim DS As New DataSet
    Dim Comm,Comm1 As New SqlClient.SqlCommand
    Dim sqlConn As New SqlClient.SqlConnection("===連線字串===")
     
    
    ' 主程式讀入採購進貨表
    Comm.CommandText = "select * from 採購進貨表 where 訂單號碼='XXXXXX'"
    Comm.Connection = sqlconn
    DA.SelectCommand = Comm
    DA.Fill(DS, "採購進貨表")
    DataGrid1.DataSource=DS.Tables("採購進貨表")
     
    
    ' 採購DataGrid _CellEnter事件
    Comm1.CommandText = "select * from 廠商表 where 廠商簡稱=N'" & DataGrid1.CurrentRow.Cells("廠商簡稱").Value & "'"
    Comm1.Connection = sqlconn
    DA1.SelectCommand = Comm1
    DA1.Fill(DS, "廠商表")
    DataGrid2.DataSource=DS.Tables("廠商表")

    但是在主程式讀取採購進貨表進行Fill時就會觸動CellEnter事件,此時DataGrid1內還沒有資料,擲出Exception

    目前使用的規避方法是Fill前設定一變數為FalseCellEnter事件內判斷此變數FalseExit SubFill完畢設變數為True

    另外還有IsDBNullIsNothing去判斷資料

    (程式內有其他類似的觸動事件會造成我取得DataGrid資料時是錯誤的,如BindingSource.MoveNext會觸動RowValidating)

    想請教是否有其他的方式控制DataGrid1不要執行此事件

    謝謝各位

    2015年6月12日 上午 03:19

解答

  • 把事件委派函式的 Handles 子句拿掉. 到了要加上事件委派函式的時候再用 AddressOf 陳述式加回來.

    註: 你沒有辦法阻止事件, 只有辦法讓事件發生時沒有委派函式可以執行. 很多人都分不清楚 "事件" 跟 "事件委派函式" 是不一樣的 (包含某些電腦書作者)


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已提議為解答 小朱MVP, Moderator 2015年6月12日 上午 04:39
    • 已標示為解答 GISK 2015年6月12日 上午 07:59
    2015年6月12日 上午 04:08
    版主

所有回覆

  • 把事件委派函式的 Handles 子句拿掉. 到了要加上事件委派函式的時候再用 AddressOf 陳述式加回來.

    註: 你沒有辦法阻止事件, 只有辦法讓事件發生時沒有委派函式可以執行. 很多人都分不清楚 "事件" 跟 "事件委派函式" 是不一樣的 (包含某些電腦書作者)


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已提議為解答 小朱MVP, Moderator 2015年6月12日 上午 04:39
    • 已標示為解答 GISK 2015年6月12日 上午 07:59
    2015年6月12日 上午 04:08
    版主
  • 請問Bill叔

    拿掉Handles後用AddressOf加回來,跟用RemoveHandler+AddHandler是一樣的嗎?

    2015年6月12日 上午 05:32
  • 效果是一樣的
    2015年6月12日 上午 06:43
  • 有一點不一樣, 如果你保留了Handles 而在程式碼裡 RemoveHandler, 表示在建構式中呼叫 InitializeComponent (在其中建立該控制項執行個體那段) 到 RemoveHandler的期間該委派關係是存在的.

     我前面沒講清楚, 加回來的完整敘述是 AddHandler  aa.bb, AddressOf cc

    詳見
    WithEvents 和 Handles 子句
    WithEvents (Visual Basic)
    AddHandler 和 RemoveHandler

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。



    2015年6月12日 上午 07:27
    版主