程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 實現NBearDataSource控件 - 02-11 20:30 修訂 - 新增Master/Deta

實現NBearDataSource控件 - 02-11 20:30 修訂 - 新增Master/Deta

編輯:關於.NET

很多朋友抱怨使用NBear時,和GridView和DetailsView等的綁定不便,為此,寫了一個NBearDataSource控件,可以直接和其他DataSource一樣進行綁定。

下面是一組示例,隨示例包含了NBearDataSource控件和PagableRepeater控件的dll,源代碼已經在NBear的V3.6.3以上版本中包含。

本示例演示了使用NBearDataSource控件進行CRUD、使用NBearDataSource控件和NBear的強類型查詢語法進行可視化查詢、使用PagableRepeater控件進行數據綁定和一個典型的基於NBearDataSource的Master/Detail實體CRUD示例。大家可以看到,使用NBearDataSource的情況下,數據綁定的操作過程大大簡化了。

Web.config

1<?xml version="1.0"?>
2<configuration>
3 <configSections>
4  <section name="entityConfig" type="NBear.Common.EntityConfigurationSection, NBear.Common" />
5 </configSections>
6 <connectionStrings>
7  <add name="test access db" connectionString="Provider=Microsoft.Jet.OLEDB.4.0; Data Source=|DataDirectory|\DSTest.mdb" providerName="access"/>
8 </connectionStrings>
9  <system.web>
10    <compilation debug="true" defaultLanguage="C#">
11      <assemblies>
12        <add assembly="System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
13        <add assembly="System.Transactions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/></assemblies>
14    </compilation>
15    <xhtmlConformance mode="Strict"/>
16    <customErrors mode="Off"/>
17    <authentication mode="None"/>
18  </system.web>
19 <entityConfig>
20  <includes>
21   <add key="Sample" value="~/EntityConfig.xml" />
22  </includes>
23 </entityConfig>
24</configuration>

第4和21行配置了EntityConfig.xml。

第7行使用nbear擴展的connectionstring配置語法設置connstr和providerName。注意這裡可以使用類似的asp.net2.0下的sql2005中的|DataDirectory|來指定mdb的相對路徑。(這個在標准的Access OleDb connstr語法中是不支持的,只在nbear中支持)。providerName也使用了簡化語法access就是對應了Access數據庫。

Default.aspx

1<%@ Page Language="C#" %>
2<%@ Register TagPrefix="nb" Namespace="NBear.Web.Data" Assembly="NBear.Web.Data" %>
3<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4<html xmlns="http://www.w3.org/1999/xhtml" >
5<head runat="server">
6  <title>NBear DataSource Test</title>
7</head>
8<body>
9<form id="aspnetForm" runat="server">
10  <nb:NBearDataSource ID="TestDS" runat="server" ConnectionStringName="test access db"
11    TypeName="Entities.SimpleData" FilterExpression="{SimpleID} > 0" DefaultOrderByExpression="{SimpleID} DESC, {SimpleName}" />
12  <asp:GridView ID="TestGrid" runat="server" DataSourceID="TestDS" AllowSorting="true" AllowPaging="true"
13    PageSize="3" AutoGenerateEditButton="true" AutoGenerateDeleteButton="true" />
14  <br />
15  <asp:DetailsView ID="TestDetail" runat="server" DataSourceID="TestDS" DefaultMode="Insert"
16      AutoGenerateInsertButton="true" AutoGenerateRows="false">
17    <Fields><asp:BoundField DataField="SimpleName" HeaderText="Name" /></Fields>
18  </asp:DetailsView>
19</form>
20</body>
21</html>
Default.aspx沒有Code Behind代碼,純粹是用asp.net 2.0的控件和NBearDataSource來CRUD。頁面Default.aspx的運行效果就是,GridView可以RUD,DetailsView中可以C。

第二個頁面StrongTypeQuerySample.aspx

1<%@ Page Language="C#" AutoEventWireup="true" CodeFile="StrongTypeQuerySample.aspx.cs" Inherits="StrongTypeQuerySample" %>
2<%@ Register TagPrefix="nb" Namespace="NBear.Web.Data" Assembly="NBear.Web.Data" %>
3
4<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
6<html xmlns="http://www.w3.org/1999/xhtml" >
7<head runat="server">
8  <title>NBear DataSource Test - Strong Type Query Sample</title>
9</head>
10<body>
11  <form id="form1" runat="server">
12  Name to Query: <asp:TextBox ID="txtName" runat="server"></asp:TextBox> (* as wild char) &nbsp;&nbsp;
13  Order By: <asp:DropDownList ID="listOrderByProperty" runat="server">
14  <asp:ListItem Selected="True" Text="SimpleId" Value="SimpleId"></asp:ListItem>
15  <asp:ListItem Text="SimpleName" Value="SimpleName"></asp:ListItem>
16  </asp:DropDownList>
17  <asp:DropDownList ID="listOrderByDesc" runat="server">
18  <asp:ListItem Selected="True" Text="ASC" Value="ASC"></asp:ListItem>
19  <asp:ListItem Text="DESC" Value="DESC"></asp:ListItem>
20  </asp:DropDownList>
21  &nbsp;<asp:Button ID="btnFind" runat="server" Text="Find" OnClick="btnFind_Click" /><br />
22  <br />
23  <nb:NBearDataSource ID="TestDS" runat="server" ConnectionStringName="test access db"
24    TypeName="Entities.SimpleData" />
25  <asp:GridView ID="TestGrid" runat="server" DataSourceID="TestDS" />
26
27  </form>
28  <hr />
29<a href="Default.aspx">Back to Default</a>
30</body>
31</html>

該頁面包含了一個簡單的GridView和NBearDataSource和一組用於可視化查詢的textbox和dropdownlist控件。

StrongTypeQuerySample.aspx.cs

1using System;
2using System.Data;
3using System.Configuration;
4using System.Collections;
5using System.Web;
6using System.Web.Security;
7using System.Web.UI;
8using System.Web.UI.WebControls;
9using System.Web.UI.WebControls.WebParts;
10using System.Web.UI.HtmlControls;
11
12public partial class StrongTypeQuerySample : System.Web.UI.Page
13{
14  protected void Page_Load(object sender, EventArgs e)
15  {
16
17  }
18
19  protected void btnFind_Click(object sender, EventArgs e)
20  {
21    string name = txtName.Text.Replace("*", "%");
22    if (!string.IsNullOrEmpty(name))
23    {
24      TestDS.Filter(Entities.SimpleData._.SimpleName.Like(name));
25    }
26    if (listOrderByProperty.SelectedValue == "SimpleId")
27    {
28      if (listOrderByDesc.SelectedIndex == 0)
29      {
30        TestDS.OrderBy(Entities.SimpleData._.SimpleId.Asc);
31      }
32      else
33      {
34        TestDS.OrderBy(Entities.SimpleData._.SimpleId.Desc);
35      }
36    }
37    else if (listOrderByProperty.SelectedValue == "SimpleName")
38    {
39      if (listOrderByDesc.SelectedIndex == 0)
40      {
41        TestDS.OrderBy(Entities.SimpleData._.SimpleName.Asc);
42      }
43      else
44      {
45        TestDS.OrderBy(Entities.SimpleData._.SimpleName.Desc);
46      }
47    }
48  }
49}

在btnFind按鈕的Click事件中,我們根據用戶輸入的查詢條件和排序條件,使用NBearDataSource的Filter(WhereClip)和OrderBy(OrderByClip)方法進行動態查詢。

注意,這兩個方法個接收一個參數WhereClip/OrderByClip,它是nbear支持的強類型查詢表達式參數。如示例中所示,我們可以方便的使用NBear支持的強類型查詢語法指定查詢條件和排序條件,如這裡的line 24和line30。

簡單說明一下NBearDataSource 的常用屬性、方法和事件:

1、ConnectionStringName - Web.config中的connstr設置的name,可以不指定,不指定的話,默認對應web.config中的所有constr中的最後一個,類似NBear中的Gateway.Default對應最後一個connstr設置。

2、TypeName - 該DataSource承載的實體類型完整名稱,必須設置。

3、FilterExpression和DefaultOrderByExpression - 可選的自定義查詢條件和排序條件。{XX}表示一個實體的屬性名稱,NBear會在運行時將屬性對應到相應的數據庫字段,其他語法和sql一致。

4、Filter(WhereClip where)和OrderBy(OrderByClip orderBy)方法 - 可以運行時調用的方法,參數是nbear的強類型查詢/排序表達式,調用這兩個方法後,強類型表達式的值會覆蓋FilterExpression和DefaultOrderByExpression屬性的值。

5、Saving/Saved事件 - 這兩個事件會在Insert或Update的前後被調用,並允許用戶操作Save過程中的實體。

關於GridView和Repeater(DataList)如何使用NBearDataSource提供的分頁支持

1、對於GridView,只需設定其PageSize、PageIndex屬性即可。

2、對於Repeater(DataList)控件,只需要設置其Repeater.SelectArguments.StartRowIndex和MaximumRows屬性,指定當前綁定第幾頁,每頁頁數等參數即可。不過注意Repeater的SelectArguments屬性是一個protected屬性,所以,可能需要繼承一個自定義的Repeater,並暴露可以修改Repeater.SelectArguments的接口。

例如,如果希望綁定第5頁,每頁10條記錄,只需要設置StartRowIndex=(5-1)*10=40, MaximumRows=10 (也就是每頁記錄數)。

內部實現

當指定分頁信息時NBearDataSource會在內部使用Gateway.GetPageSelector().FindPage()進行數據庫級別的分頁查詢;

如果沒有指定分頁信息,則NBearDataSource內部會通過Gateway.FindArray()方法進行查詢,並返回所有記錄。

NBearV3.6.3新增PagableRepeater控件,也就是擴展了PageSize和PageIndex屬性的Repeater控件,可以直接使用該控件結合任意的支持分頁的DataSource綁定某一頁數據。下面是一個使用使用了這個擴展的PagableRepeater控件的示例:

PagableRepeaterSample.aspx

1<%@ Page Language="C#" AutoEventWireup="true" CodeFile="PagableRepeaterSample.aspx.cs" Inherits="PagableRepeaterSample" %>
2<%@ Register TagPrefix="nb" Namespace="NBear.Web.Data" Assembly="NBear.Web.Data" %>
3
4<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
6<html xmlns="http://www.w3.org/1999/xhtml" >
7<head runat="server">
8  <title>NBear DataSource Test - Pagable Repeater Sample</title>
9</head>
10<body>
11  <form id="form1" runat="server">
12  <nb:NBearDataSource ID="TestDS" runat="server" ConnectionStringName="test access db"
13    TypeName="Entities.SimpleData" DefaultOrderByExpression="{SimpleId} DESC" />
14  <nb:PagableRepeater ID="rpPagable" runat="server" PageIndex="2" PageSize="3" DataSourceID="TestDS">
15  <ItemTemplate>SimpleId=<%# Eval("SimpleId") %>, SimpleName=<%# Eval("SimpleName") %><br /></ItemTemplate>
16  </nb:PagableRepeater>
17  </form>
18  <hr />
19<a href="Default.aspx">Back to Default</a><br />
20<a href="StrongTypeQuerySample.aspx">Strong Type Query Sample</a>
21</body>
22</html>

Line14-16使用了PagableRepeater控件,可以看到只需要指定PageSize和PageIndex屬性就行,使用非常簡單。雖然這裡PagableRepeater控件使用了NBearDataSource作為數據源,但實際上,也可以使用別的DataSource,只需要DataSource支持基於SelectArguments的自定義分頁,比如SqlDataSource。

基於NBearDataSource的Master/Detail實體CRUD示例

MasterDetailCRUDSample.aspx

1<%@ Page Language="C#" AutoEventWireup="true" CodeFile="StrongTypeQuerySample.aspx.cs" Inherits="StrongTypeQuerySample" %>
2<%@ Register TagPrefix="nb" Namespace="NBear.Web.Data" Assembly="NBear.Web.Data" %>
3
4<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
6<html xmlns="http://www.w3.org/1999/xhtml" >
7<head runat="server">
8  <title>NBear DataSource Test - Strong Type Query Sample</title>
9</head>
10<body>
11  <form id="form1" runat="server">
12  Name to Query: <asp:TextBox ID="txtName" runat="server"></asp:TextBox> (* as wild char) &nbsp;&nbsp;
13  Order By: <asp:DropDownList ID="listOrderByProperty" runat="server">
14  <asp:ListItem Selected="True" Text="SimpleId" Value="SimpleId"></asp:ListItem>
15  <asp:ListItem Text="SimpleName" Value="SimpleName"></asp:ListItem>
16  </asp:DropDownList>
17  <asp:DropDownList ID="listOrderByDesc" runat="server">
18  <asp:ListItem Selected="True" Text="ASC" Value="ASC"></asp:ListItem>
19  <asp:ListItem Text="DESC" Value="DESC"></asp:ListItem>
20  </asp:DropDownList>
21  &nbsp;<asp:Button ID="btnFind" runat="server" Text="Find" OnClick="btnFind_Click" /><br />
22  <br />
23  <nb:NBearDataSource ID="TestDS" runat="server" ConnectionStringName="test access db"
24    TypeName="Entities.SimpleData" />
25  <asp:GridView ID="TestGrid" runat="server" DataSourceID="TestDS" AllowSorting="true" />
26
27  </form>
28  <hr />
29<a href="Default.aspx">Back to Default</a><br /> 
30<a href="PagableRepeaterSample.aspx">Pagable Repeater Sample</a><br />
31  <a href="MasterDetailCRUDSample.aspx">Master Detail CRUD Sample</a>
32</body>
33</html>

aspx頁面為Master和Detail實體分別定一個DataSource、GridView和DetailsView。

MasterDetailCRUDSample.aspx.cs

1using System;
2using System.Data;
3using System.Configuration;
4using System.Collections;
5using System.Web;
6using System.Web.Security;
7using System.Web.UI;
8using System.Web.UI.WebControls;
9using System.Web.UI.WebControls.WebParts;
10using System.Web.UI.HtmlControls;
11
12public partial class MasterDetailCRUDSample : System.Web.UI.Page
13{
14  protected void Page_Load(object sender, EventArgs e)
15  {
16    dsDetails.Saving += new EventHandler<NBear.Web.Data.NBearDataSourceEventArgs>(dsDetails_Saving);
17  }
18
19  void dsDetails_Saving(object sender, NBear.Web.Data.NBearDataSourceEventArgs e)
20  {
21    Entities.Detail detail = (Entities.Detail)e.Entity;
22    if (!detail.IsAttached()) //entity.IsAttached() before inserted is false, after inserted or when updating is true.
23    {
24      detail.MasterID = int.Parse(gdMaster.SelectedRow.Cells[1].Text);
25    }
26  }
27
28  protected void gdMaster_SelectedIndexChanged(object sender, EventArgs e)
29  {
30    if (gdMaster.SelectedRow != null)
31    {
32      gdDetail.Visible = true;
33      dtDetail.Visible = true;
34      dsDetails.Filter(Entities.Detail._.MasterID == int.Parse(gdMaster.SelectedRow.Cells[1].Text));
35    }
36    else
37    {
38      gdDetail.Visible = false;
39      dtDetail.Visible = false;
40    }
41  }
42}

code-behind代碼也很簡單,一方面在Master的GridView事件中,改變關聯的Detail的DataSource的查詢條件,顯示Master關聯的Details;另一方面,在Detail的DataSource的Saving事件中,將Detail的MasterID屬性值設為當前選中的Master的ID。這樣就很容易的實現了Master和Detail的關聯查詢、更新和刪除。

歡迎大家多提意見,我會盡可能在今後的發布時參考大家的修改意見。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved