ExtAspNet為表格控件提供非常豐富的擴展列,這些擴展列不僅豐富了數據展示的形式,而且極大地減少了程序員的編碼量。
序號列與復選列
首先來看下序號列和復選列的實際效果:
序號列和復選列只能出現在表格最前面的兩個位置,並且啟用這兩個列的方法也非常簡單:
只需要設置表格的EnableRowNumber和EnableCheckBoxSelect屬性為true即可!
注意:序號列表示的是當前頁的順序,因此即使表格翻頁后依然是從1開始的。
單選模式與多選模式
表格默認是多選模式,也就是可以一次選擇多條數據,選擇多條數據的方式和Windows下選擇文件的方式類似:
- 多次點擊復選列的復選框來選擇多行數據;
- 按下Shift鍵選擇連續的多行數據;
- 按下Control鍵選擇不連續的多行數據。
注意:點擊另一行會取消之前的所有選中行數據!
如果想啟用表格的單選模式,只需要設置EnableMultiSelect屬性為false即可!
如何在后台獲得選中的行?
1: protected void Button1_Click(object sender, EventArgs e)
2: {
3: StringBuilder sb = new StringBuilder();
4: int[] selections = Grid1.SelectedRowIndexArray;
5: foreach (int rowIndex in selections)
6: {
7: sb.AppendFormat("行索引:{0} 用戶名:{1}<br />", rowIndex, Grid1.DataKeys[rowIndex][1]);
8: }
9: labResult.Text = sb.ToString();
10: }
通過如下步驟獲得選中行的數據:
- 通過表格的SelectedRowIndexArray獲得選中行的索引號列表;
- 通過表格的DataKeys(二維數組)獲取本行的數據列表,這就需要事先設置表格的DataKeyNames屬性(本例中是"Id,Name")。
行擴展列
先來看下行擴展列的顯示效果:
看似復雜,其實實現起來相當的簡單,行擴展列其實就是一個帶RenderAsRowExpander屬性的模板列:
1: <ext:Grid ID="Grid1" ShowBorder="true" ShowHeader="true" Title="表格" Width="800px"
2: runat="server" DataKeyNames="Id,Name">
3: <Columns>
4: <ext:TemplateField RenderAsRowExpander="true">
5: <ItemTemplate>
6: <div class="expander">
7: <p>
8: <strong>姓名:</strong><%# Eval("Name") %></p>
9: <p>
10: <strong>簡介:</strong><%# Eval("Desc") %></p>
11: </div>
12: </ItemTemplate>
13: </ext:TemplateField>
14: <ext:TemplateField Width="60px">
15: <ItemTemplate>
16: <asp:Label ID="Label1" runat="server" Text='<%# Container.DataItemIndex + 1 %>'></asp:Label>
17: </ItemTemplate>
18: </ext:TemplateField>
19: <ext:BoundField Width="100px" DataField="Name" DataFormatString="{0}" HeaderText="姓名" />
20: // 省略其他列...
21: </Columns>
22: </ext:Grid>
行擴展列默認是折疊起來的,如何讓所有的行擴展列默認打開呢?
ExtAspNet考慮到了這個實際的需求,只需要設置一個屬性ExpandAllRowExpanders即可實現如下效果:
模擬樹列
模擬樹列是ExtAspNet的一個簡單創新,卻非常有用,來看實際效果:
大家也可以先考慮下如何實現這個效果,為了盡量和普通表格的數據綁定保持一致,數據源也必須是DataTable或者IEnumerable。
有了這個設定,問題就簡單了,我們只需要為每行數據准備一個表示樹層次的字段即可。
就本例而言,如果“中國”行的樹層次為0,則有如下簡單的規則:
- 中國:0
- 河南省:1
- 駐馬店市:2
- 漯河市:2
- 安徽省:1
- 合肥市:2
- 黃山市:2
下面來看下模擬此結構的數據實現代碼:
1: private static DataTable IniGrid()
2: {
3: DataTable table = new DataTable();
4: DataColumn column1 = new DataColumn("Id", typeof(int));
5: DataColumn column2 = new DataColumn("Name", typeof(String));
6: DataColumn column3 = new DataColumn("Group", typeof(String));
7: DataColumn column4 = new DataColumn("TreeLevel", typeof(int));
8: table.Columns.Add(column1);
9: table.Columns.Add(column2);
10: table.Columns.Add(column3);
11: table.Columns.Add(column4);
12:
13: DataRow row = table.NewRow();
14: row[0] = 101;
15: row[1] = "中國";
16: row[2] = "1";
17: row[3] = 0;
18: table.Rows.Add(row);
19:
20: row = table.NewRow();
21: row[0] = 102;
22: row[1] = "河南省";
23: row[2] = "2";
24: row[3] = 1;
25: table.Rows.Add(row);
26:
27: row = table.NewRow();
28: row[0] = 103;
29: row[1] = "駐馬店市";
30: row[2] = "3";
31: row[3] = 2;
32: table.Rows.Add(row);
33:
34: row = table.NewRow();
35: row[0] = 104;
36: row[1] = "漯河市";
37: row[2] = "3";
38: row[3] = 2;
39: table.Rows.Add(row);
40:
41: row = table.NewRow();
42: row[0] = 105;
43: row[1] = "安徽省";
44: row[2] = "2";
45: row[3] = 1;
46: table.Rows.Add(row);
47:
48: row = table.NewRow();
49: row[0] = 106;
50: row[1] = "合肥市";
51: row[2] = "3";
52: row[3] = 2;
53: table.Rows.Add(row);
54:
55: row = table.NewRow();
56: row[0] = 107;
57: row[1] = "黃山市";
58: row[2] = "3";
59: row[3] = 2;
60: table.Rows.Add(row);
61:
62: return table;
63: }
來看下ASPX標簽結構,我們需要為“地區”列指定要綁定的樹層次字段:
1: <ext:Grid ID="Grid1" Title="表格" ShowBorder="true" ShowHeader="true" AutoHeight="true"
2: runat="server" EnableCheckBoxSelect="True" DataKeyNames="Id,Name" Width="800px"
3: EnableRowNumber="True">
4: <Columns>
5: <ext:BoundField DataField="Name" DataSimulateTreeLevelField="TreeLevel" DataFormatString="{0}"
6: HeaderText="地區" ExpandUnusedSpace="True" />
7: <ext:ImageField Width="60px" DataImageUrlField="Group" DataImageUrlFormatString="~/images/16/{0}.png"
8: HeaderText="分組"></ext:ImageField>
9: </Columns>
10: </ext:Grid>
注意:“地區”列的DataSimulateTreeLevelField屬性將此列轉換為模擬樹的列。
彈出窗體列
彈出窗口列,顧名思義就是點擊可以彈出窗體的列,其實用模板列也完全可以實現,只不過彈出窗體列可以簡化我們的代碼編寫。
首先看下顯示效果:
要實現此效果,頁面上必須事先定義一個隱藏的Window控件,如下所示:
1: <ext:Window ID="Window1" Title="編輯" Popup="false" EnableIFrame="true" runat="server"
2: CloseAction="HidePostBack" EnableConfirmOnClose="true" IFrameUrl="about:blank"
3: EnableMaximize="true" EnableResize="true" OnClose="Window1_Close" Target="Top"
4: IsModal="True" Width="750px" Height="450px">
5: </ext:Window>
關於Window控件,后面會有專門篇幅講解,這就不多說。
而彈出窗體列的作用就是生成一個可以點擊的錨點鏈接,當用戶點擊時在客戶端直接彈出這個窗體。
模板列實現彈出窗體列的功能
首先來看下使用模板列的ASPX標簽定義:
1: <ext:TemplateField HeaderText="模板列" Width="60px">
2: <ItemTemplate>
3: <a href="javascript:<%# GetEditUrl(Eval("Id"), Eval("Name")) %>">編輯</a>
4: </ItemTemplate>
5: </ext:TemplateField>
再來看下GetEditUrl函數的定義:
1: protected string GetEditUrl(object id, object name)
2: {
3: return Window1.GetShowReference("grid_iframe_window.aspx?id=" + id, "編輯 - " + name);
4: }
彈出窗體列的結構
而相同的功能使用彈出窗體列,只需要ASPX標簽定義就行了,而且可以方便地定義彈出窗體標題,IFrame地址等屬性:
1: <ext:WindowField ColumnID="myWindowField" Width="60px" WindowID="Window1" HeaderText="窗口列"
2: Icon="Pencil" ToolTip="編輯" DataTextFormatString="{0}" DataIFrameUrlFields="Id"
3: DataIFrameUrlFormatString="grid_iframe_window.aspx?id={0}" DataWindowTitleField="Name"
4: DataWindowTitleFormatString="編輯 - {0}" />
小結
ExtAspNet對表格的擴展列不僅豐富了數據展現的形式,而且極大的方便了代碼的編寫。特別是序號列、復選列以及彈出窗體列在實際項目中非常實用,需要大家熟練掌握。下一篇文章,我們會詳細討論表格中的各種事件,其實我們在上一篇文章已經接觸到了排序和翻頁兩種事件,除此之外還有更多的事件等待着我們去探索學習。