none
DataTable事件問題 RRS feed

  • 問題

  •  

    請教一下版上的前輩,小弟於winows程式中利用vs2008產生dataset和datatable,於程式中產生datatable的TableNewRow事件來輸入table的預設值,但是小弟希望於datarow存檔前記錄最後修改人和最後修改時間,不知道要做到這個功能需要在哪個事件處理呢??

    煩請版上前輩不吝指教,謝謝!

    2008年6月4日 上午 02:16

解答

  • Hi,

     

       在ADO.NET中,實現類似BeforePost的方式有兩個

    1. 利用partial class機制,延伸TableAdapter,掛載事件至DataAdapter的RowUpdating,在資料寫入資料庫前,將日期填入.

    2. 掛載事件至RowChanging,這是最接近BeforePost寫法的一種,可是因為RowChanging中不能修改欄位值,所以必須用

        Reflection機制改變預設行為.

     

    就你的需求而言,我想第一種方式就可以處理了.

     

    2008年6月7日 上午 05:37

所有回覆

  • 在存檔的事件一開始寫,寫完在存檔.

     

    2008年6月4日 上午 03:08
    版主
  • HI,

     

    應該要多準備兩個欄位來存放最後修改人和最後修改時間, 不然要存在那裏? 有了這兩個欄位, 可以在DataTable的RowChanged事件中處理

     

    tihs

     

    2008年6月4日 上午 03:10
  • 您好,小弟知道要有2個欄位來存這兩個資料,請教一下在RowChanged事件中該如何把值指定給欄位呢??

     

    我用 e.Row["BUILD_NAME"] = "TEST"; 方法給值會發生錯誤,不知在這個事件該如何做才對??煩請指教,謝謝!

    2008年6月4日 上午 04:41
  • HI,

     

    如果您的DataSet中已經有兩個存放額外資料的欄位, 您可以在Load事件中加入以下的程式碼, 這樣做比較快:

     

     

                DataColumn dt=DataSet物件.Table名稱.Columns["Date"];
                dt.DefaultValue =  DateTime.Now ;

                DataColumn du=DataSet物件.Table名稱.Columns["User"];
                du.DefaultValue = SystemInformation.UserName;

    當您要新增記錄時, 欄位已經填好內容了

     

    tihs

    2008年6月5日 上午 03:47
  •  

    多謝前輩的回覆,如果是給預設值,小弟會於table的TableNewRow事件給值,但若是修改時,就無法處理了!

    之前使用delphi開發,於dataset中有一個beforePost的事件來處理,現在於C#卻不知該如何處理??

    2008年6月5日 上午 05:27
  • 您所謂的[若是修改時,就無法處理了]是什麼意思?

     

    tihs

    2008年6月6日 上午 01:55
  • 小弟的意思是當新增時可以於newrow事件給值,但是若是修改資料時,就不知道該再哪一個事件給值了??

     

    2008年6月6日 上午 02:23
  •  

    我是用C# +WPF+LINQ 去作資料處理應用程式,我將我的寫法給你參考.

    我的作法是每個Table除了給EndUser看的欄位外,都加入ID,建造者,建造日期,修改者,修改日期...欄位.

    程式新增是按Insert 在KeyDown 事件裡作新增動作,並將建造者,件造日期填入.

    按F2作修改,將修改者,修改日期欄位寫入.

    按Delete,將修改者,修改日期欄位寫入.

    2008年6月6日 上午 02:47
  • 利用修改按鈕的事件來記錄修改者的資料,這也是一個方法!

    不過小弟設計的介面並沒有修改的按鈕,而是vs中預設的介面,直接就可以編輯,編輯完成後再存檔!

    這種情形下,就不知該如何解決了??

     

    順便請教一下大哥,若如您設計的介面,需按f2才可進入編輯狀態,於瀏覽模式時是否將所有的元件都放在panel上,然後將的enable設為false,當使用者按下f2時,才將enable設為true呢??

    2008年6月6日 上午 03:31
  • 因為我公司龜毛,它就是不想用Windows的介面,也就是沒有按鈕,也就是不要讓滑鼠在那裡點來點去的(這樣工作沒效率),所以都是Keyboard事件.

     

    我的作法如果只是單純的List(不是那種Master Detail),在視窗任何地方按Insert 就去觸發新增事件.

    在List 瀏覽到某筆Row 按Delete 就刪除該Row.

    在List 瀏覽到某筆Row 按F2 就將 Control 在編輯/非編輯模式下切換.

     

    而我也不是單純的只改變Controls 的 ReadOnly 而以,我是用WPF 的Command 的功能,當End User Login 去判斷權限,去設定他們能否新/刪/修的權限,如果沒有就在Command 將相關事件攔截掉.

     

     

    2008年6月6日 上午 03:46
  • 多謝大哥的回覆,小弟還是等等看有沒有其他的解決方式!謝謝!

     

    2008年6月6日 上午 04:32
  • 用Table的ColumnChanged事件去處理即可.

    ex :

    DataSet1.Tables[0].ColumnChanged+=new System.Data.DataColumnChangeEventHandler(this.Column_Changed);

     

    private void Column_Changed(object sender, System.Data.DataColumnChangeEventArgs e)

    {

        if (e.Column.ColumnName!="Build_Time") //加這判斷的原因是,避免異動到Build_Time欄位值時,又再觸發事件一次.

        {

    e.Row["Build_Time"]=DataTime.Now; //把新的異動時間存進去

        }

    }

    2008年6月6日 上午 07:28
  • Hi,

     

       在ADO.NET中,實現類似BeforePost的方式有兩個

    1. 利用partial class機制,延伸TableAdapter,掛載事件至DataAdapter的RowUpdating,在資料寫入資料庫前,將日期填入.

    2. 掛載事件至RowChanging,這是最接近BeforePost寫法的一種,可是因為RowChanging中不能修改欄位值,所以必須用

        Reflection機制改變預設行為.

     

    就你的需求而言,我想第一種方式就可以處理了.

     

    2008年6月7日 上午 05:37
  •  code6421 寫信:

    Hi,

     

       在ADO.NET中,實現類似BeforePost的方式有兩個

    1. 利用partial class機制,延伸TableAdapter,掛載事件至DataAdapter的RowUpdating,在資料寫入資料庫前,將日期填入.

    2. 掛載事件至RowChanging,這是最接近BeforePost寫法的一種,可是因為RowChanging中不能修改欄位值,所以必須用

        Reflection機制改變預設行為.

     

    就你的需求而言,我想第一種方式就可以處理了.

     

     

    多謝大哥的回覆,如果使用第一中方式,若異動資料超過一筆,資料寫回資料庫時,該如何更新異動時間等資訊到欄位中呢??

    2008年6月9日 上午 01:20
  • Hi,

     

       

         >若異動資料超過一筆,資料寫回資料庫時,該如何更新異動時間等資訊到欄位中呢??

         每一筆資料異動都會觸發RowUpdating,所以只要於此事件中,將異動等資訊填到相對應的Parameter即可,

         回返值則依靠最後的SELECT回傳,

         詳細請參照MSDN,或是參考市面上的書籍,多數對此應該都會提及.

    2008年6月11日 上午 06:22
  •  code6421 寫信:

    Hi,

     

       

         >若異動資料超過一筆,資料寫回資料庫時,該如何更新異動時間等資訊到欄位中呢??

         每一筆資料異動都會觸發RowUpdating,所以只要於此事件中,將異動等資訊填到相對應的Parameter即可,

         回返值則依靠最後的SELECT回傳,

         詳細請參照MSDN,或是參考市面上的書籍,多數對此應該都會提及.

     

    多謝大哥的指教,這應該就是小弟想要的答案了!

    可否告知在 RowUpdating 事件中該如何給Parameter值呢??煩請回覆,謝謝!

    2008年6月11日 上午 07:42
  • 直接給值即可,如

    sqlAdapter.UpdateCommand.Parameters("@upduser").Value = MyFunc.user_id

     

    試試看.

    2008年11月18日 上午 03:41