none
RowPrePaint事件請益 RRS feed

  • 問題

  • 請問各位前輩

    我參考 Visual C# 2015資料庫程式設計暨進銷存系統實作 這本書做法.

    假設有2個Table. 一個是訂單,一個出貨單.

    出貨單中的品名規格,是抓訂單.

    出貨單,在 DataGridView 的 RowPrePaint 事件裡,處理抓取訂單的品名規格.

    為什麼會一直重複的執行RowPrePaint 事件裡的程序?明細只有一筆.

    依我的需求,是否有別的作法? google好像很少在RowPrePaint做這樣的處理.

    程式如下:

    private void plan1DataGridView_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
            {
                int iCounts;
                if (TBStatus == 0)
                {
                    iCounts = 1;
                }
                else
                {
                    // 編輯狀態下, 最後筆不做搜尋品名規格處理.
                    iCounts = 2;
                }
                
                //編輯狀態下, 不做搜尋品名規格處理.
                if ((plan1DataGridView.Rows.Count - iCounts) >= e.RowIndex)
                {
                    DataGridView Grid = plan1DataGridView;

                    //取得目前的Sodb1
                    string xSno = (string)Grid.Rows[e.RowIndex].Cells[colSno.Index].Value;
                    string xNum = (string)Grid.Rows[e.RowIndex].Cells[colNum.Index].Value;

                    var qry2 = (from C in context.Sod1
                                where C.Sno + C.Num == xSno + xNum
                                select C).FirstOrDefault();
                    if (qry2 != null)
                    {
                        Grid.Rows[e.RowIndex].Cells[colctno.Index].Value = qry2.Sod.Ctno;
                        Grid.Rows[e.RowIndex].Cells[coldesc1.Index].Value = qry2.SodPro.Desc1;
                        Grid.Rows[e.RowIndex].Cells[coldescr2.Index].Value = qry2.SodPro.Descr2;
                        Grid.Rows[e.RowIndex].Cells[colDat1i.Index].Value = qry2.Dat1;
                    }
                }
                
            }

    2019年10月14日 上午 09:56

解答

  • DataSet.Relations 屬性可以加入多個 Relation 。比方你就是 relation1 是用 No 欄位關聯,relations2 是用 SEQ 關聯。通通加進 DataSet.Relations 屬性中

    關於 DataRelation,建議你可以讀以下幾篇文章

    https://dotblogs.com.tw/red315/2012/03/27/71054

    https://dotblogs.com.tw/jeff-yeh/2009/01/09/6710

    通常我會比較傾向於另一種作法,就是直接在讀取資料表的時候用 Join 關聯。

    關於 ADO.NET ,建議可以閱讀 Microsoft Docs 的文件,很豐富也很清楚。

    ADO.NET (Microsoft Docs)


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




    2019年10月15日 下午 03:06
    版主

所有回覆

  • 如果是點選Row要執行相關的查詢可以考慮使用RowEnter事件
    2019年10月15日 上午 12:29
  • 不是點選Row執行查詢.

    是一個 DataGridView 要顯示2個Table的資料時,

    怎麼做比較簡單快速? 照書本的做法,是資料來源 A Table ,

    在 RowPrePaint 事件裡,取得 B Table資料. 但不知為何會一直不斷重複執行. 

    2019年10月15日 上午 01:11
  • 是Master-Details顯示嗎? 如果是Master-Details顯示, 可以用兩個DataGridView, 在第一個DataGridView的RowEnter時查出另外一個Table, 再填入到第二個DataGridView效果也不錯
    2019年10月15日 上午 02:40
  • 不是欸.

    A Table 產品檔. 有料號、品名規格

    B Table 訂購單.記錄料號.DataGridview 繫結到B,再從A撈出品名規格.

    書中的做法是寫在RowPrePaint. 我照著做會一直跑這個事件,不曉得是哪裡的問題.

    我知道可以先把資料合併成一個Table. 但這樣太麻煩了.

    有沒有比較好的做法?


    2019年10月15日 上午 03:04
  • 撈資料寫在 RowPrePaint 實在是有趣的想法。一般應該都是為了修改渲染才會用到這才對。

    你的需求是要做 Master-Detail 嗎 ?


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

    2019年10月15日 上午 03:44
    版主
  • 是的 Master-Detail 表單. Detail 裡要去撈產品檔的品名、規格.

    Detail 除了處理成一個Table還有其他較快速簡便的做法嗎?

    2019年10月15日 上午 03:58
  • 主從式表單我是建議參考文件庫的做法啦,使用資料繫結的方式,讓資料的歸資料,畫面的歸畫面

    逐步解說:使用兩個 Windows Forms DataGridView 控制項建立主從式表單

    如果你是 "一個 DataGridView 要顯示2個Table的資料" 這樣的需求,事實上應該是在 Sql select 的時候就直接下 Join 取得資料,簡單又方便。

    說難聽點,我覺得你原來用的那方式實在是太奇怪。


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

    2019年10月15日 上午 04:12
    版主
  • 再請問一下,

    DataRelation relation = new DataRelation("CustomersOrders", data.Tables["Customers"].Columns["CustomerID"], data.Tables["Orders"].Columns["CustomerID"]); data.Relations.Add(relation);

    DataRelation 需要2個欄位做 join

    EX: A Table 的 NO + SEQ 和 B Table的 NO+SEQ 連結.

    該怎麼寫?

    2019年10月15日 上午 06:17
  • DataSet.Relations 屬性可以加入多個 Relation 。比方你就是 relation1 是用 No 欄位關聯,relations2 是用 SEQ 關聯。通通加進 DataSet.Relations 屬性中

    關於 DataRelation,建議你可以讀以下幾篇文章

    https://dotblogs.com.tw/red315/2012/03/27/71054

    https://dotblogs.com.tw/jeff-yeh/2009/01/09/6710

    通常我會比較傾向於另一種作法,就是直接在讀取資料表的時候用 Join 關聯。

    關於 ADO.NET ,建議可以閱讀 Microsoft Docs 的文件,很豐富也很清楚。

    ADO.NET (Microsoft Docs)


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




    2019年10月15日 下午 03:06
    版主