用WPF做報表控制項(三)

2021-08-27 10:59:52 字數 1563 閱讀 4812

(1)表頭列寬變化時,主體和表尾的列寬怎麼跟著變化。

(2)如何初始化這個複雜的表頭。

第乙個問題其實並不難,在grid每一列右側,都加入乙個gridsplitter,然後新增dragdelta和dragcompleted兩個拖動事件即可。

gs.dragdelta += gridsplitter_dragdelta;

gs.dragcompleted += gridsplitter_dragcompleted;

private void gridsplitter_dragdelta(object sender, system.windows.controls.primitives.dragdeltaeventargs e)

private void gridsplitter_dragcompleted(object sender, system.windows.controls.primitives.dragcompletedeventargs e)

在resizewidth方法裡面,我們調整主體和表尾每一列的寬度。

private void resizewidth()

}headgrid.width = total + 18;

bottompanel.width = total;

}}

對於第二個問題,不同的專案需求,使用的方法也會不一樣。我使用了以下的結構體儲存表頭的結構:

public class headerclass

public listl

}

這類似於樹的節點。可以用xml檔案去初始化,也可以讀入資料庫。讀入資料之後,掃瞄這個結構體,算出有多少行多少列,哪些列需要合併。最核心的三個方法如下:

public void initheader(headerclass hc)

); headgrid.rowdefinitions.add(new rowdefinition());

}for (int i = 0; i < total_column; i++)

headgrid.columndefinitions.add(new columndefinition() );

int row = 0;

int col = 0;

createheader(hc, row, total_row, ref col);

}private void getrowcolumn(headerclass hc, int layer, ref int row, ref int column)

foreach (headerclass hci in hc.l)

}else

}private int createheader(headerclass hc, int row, int total_row, ref int col)

addheader(row * 2 - 1, 1, my_col, col_span, hc.n);

return col_span;

}else

}

用WPF做報表控制項(一)

datagrid是wpf自帶的報表控制項,但其功能簡單,很多時候無法滿足我們的需求。第三方庫 如devexpress 報表功能強大,但一方面資源消耗比較多,另一方面效能也較差,在一些比較差的電腦上執行很吃力。我之前就嘗試過在工控機上使用devexpress,每次啟動都需要等幾秒甚至十幾秒半分鐘,體驗...

用WPF做報表控制項(二)

首先我們看一下報表控制項最終的效果 我們可以把報表看成是三部分,分別是表頭,表主體和表尾。如果我們不使用wpf自帶的datagrid,自己一根線一根線去畫的話,這個 估計也是大工程了。所以一開始,我們就考慮使用datagrid。但datagrid怎麼做出如圖所示的表頭和表尾呢?好像根本就不可能啊。嘗...

用shell做制報表

執行效果 設定行,可以是表頭,也可以是 內容。如果是 內容,表示空值 function setrow n 行分隔線 入參 的列數。如 有5列,則入參為5 function splitline n 繪製 入參 table function settable else if shlvl eq 2 the...