language中文

[ASP.NET]强类型DataSet、ObjectDataSource、GridView、FormView快速实现数据分页展示、添加、修改和删除

visibility 1,102 comment 0 access_time 11 years ago

ASP.NET为我们提供了功能非常强大的数据访问、展示、操作的控件合对象,比如GridView、FormView控件,配合强类型的DataSet和ObjectDataSource控件,我们可以很快速的以N层结构来管理开发我们的数据。

本文主要讲解如何结合上述对象高效快速的开发我们的Web数据应用程序,关于它们的具体示例和说明请参考MSDN上相应文档:

使用强类型(类型化的)DataSet

使用ASP.NET 2.0 ObjectDataSource控件

GridView类参考

FormView控件参考

下面按步骤说明,在Access数据库中运用上述控件,如有问题请回复。

一,创建解决方案DataAccessingSample以及DataAccessingSample数据库

如下图所示创建Web应用程序:


在App_Data文件夹下创建Access数据库DataAccessingSample.mdb;此数据库包含一个表Notes,即留言表,其结构如下:


二,添加强类型的DataSet

DataSet数据集是数据表DataTable的集合,而强类型的DataSet即是继承自DataTable的强类型的DataTable的集合。在VS中添加强类型DataSet后,会自动的生成强类型的数据表DataTable以及Adaptor用于添加删除数据等,可以直接供ObjectDataSource使用。

在Web应用程序项目下,添加文件夹DAL,即数据访问层。在DAL下添加DataSet名称为NotesData:


打开此数据集,在工具箱中拖拽TableAdaptor,当项目无数据库连接时,会提示创建数据库连接:




点击查询生成器,生成查询:


最终如下:



单击下一步完成。

自此我们的强类型数据集创建完毕了:


查看NotesData.Designer.cs可以看到VS以及自动帮我们生成强类型的数据表,一些相关事件以及TableAdaptor,并且给相应的方法标注了DataObjectMethodAttribute,我们可以直接在ObjectDataSource中使用。


三,在Default,aspx中添加ObjectDataSource,GridView,FormView控件

在页面中添加ObjectDataSource控件命名为ObjectDataSourceNotes,并配置数据源(配置之前请记得生成下项目):


定义数据方法,一般情况下,VS会自动设置TableAdaptor中的对应方法:


点击完成,即可查看到生成的控件标记如下:

<asp:ObjectDataSource ID="ObjectDataSourceNotes" runat="server"
            DeleteMethod="Delete" InsertMethod="Insert"
            OldValuesParameterFormatString="original_{0}" SelectMethod="GetNotes"
            TypeName="DataAccessingSample.DAL.NotesDataTableAdapters.NotesTableAdapter"
            UpdateMethod="Update">
            <DeleteParameters>
                <asp:Parameter Name="Original_NoteID" Type="Int32" />
                <asp:Parameter Name="Original_NoteTitle" Type="String" />
                <asp:Parameter Name="Original_AddDateTime" Type="DateTime" />
                <asp:Parameter Name="Original_NoteUser" Type="String" />
            </DeleteParameters>
            <InsertParameters>
                <asp:Parameter Name="NoteTitle" Type="String" />
                <asp:Parameter Name="NoteContent" Type="String" />
                <asp:Parameter Name="AddDateTime" Type="DateTime" />
                <asp:Parameter Name="NoteUser" Type="String" />
            </InsertParameters>
            <UpdateParameters>
                <asp:Parameter Name="NoteTitle" Type="String" />
                <asp:Parameter Name="NoteContent" Type="String" />
                <asp:Parameter Name="AddDateTime" Type="DateTime" />
                <asp:Parameter Name="NoteUser" Type="String" />
                <asp:Parameter Name="Original_NoteID" Type="Int32" />
                <asp:Parameter Name="Original_NoteTitle" Type="String" />
                <asp:Parameter Name="Original_AddDateTime" Type="DateTime" />
                <asp:Parameter Name="Original_NoteUser" Type="String" />
            </UpdateParameters>
        </asp:ObjectDataSource>

从工具箱中拖拽GridView控件,设置其样式和数据源为刚添加的ObjectDataSource:


此控件的标记代码如下:

<asp:GridView ID="GridViewNotes" runat="server" AllowPaging="True"
            AutoGenerateColumns="False" CellPadding="4" DataKeyNames="NoteID"
            DataSourceID="ObjectDataSourceNotes" EnableModelValidation="True"
            ForeColor="#333333" PageSize="5">
            <AlternatingRowStyle BackColor="White" />
            <Columns>
                <asp:BoundField DataField="NoteID" HeaderText="NoteID" InsertVisible="False"
                    ReadOnly="True" SortExpression="NoteID" />
                <asp:BoundField DataField="NoteTitle" HeaderText="NoteTitle"
                    SortExpression="NoteTitle" />
                <asp:BoundField DataField="NoteContent" HeaderText="NoteContent"
                    SortExpression="NoteContent" />
                <asp:BoundField DataField="AddDateTime" HeaderText="AddDateTime"
                    SortExpression="AddDateTime" />
                <asp:BoundField DataField="NoteUser" HeaderText="NoteUser"
                    SortExpression="NoteUser" />
                <asp:CommandField ShowDeleteButton="True" ShowEditButton="True"
                    ShowSelectButton="True" />
            </Columns>
            <EmptyDataTemplate>
                还没有留言。
            </EmptyDataTemplate>
            <FooterStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
            <HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
            <PagerStyle BackColor="#FFCC66" ForeColor="#333333" HorizontalAlign="Center" />
            <RowStyle BackColor="#FFFBD6" ForeColor="#333333" />
            <SelectedRowStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="Navy" />
        </asp:GridView>

生成项目打开页面,可以看到如下效果,目前尚无记录:


为了方便添加记录,我们在页面中拖拽一个按钮,以及一个FormView控件(数据源亦为ObjectDataSourceNotes),单击此按钮则显示FormView,FormView默认为添加模式,添加完毕后隐藏FormView。


这两个控件标记如下:

<asp:Button ID="ButtonAddNote" runat="server" onclick="ButtonAddNote_Click"
            Text="Add Note" />
        <br />
        <asp:FormView ID="FormViewNotes" runat="server" CellPadding="4"
            DataKeyNames="NoteID" DataSourceID="ObjectDataSourceNotes" DefaultMode="Insert"
            EnableModelValidation="True" ForeColor="#333333" GridLines="Both"
            oniteminserted="FormViewNotes_ItemInserted" Visible="False">
            <EditItemTemplate>
                NoteID:
                <asp:Label ID="NoteIDLabel1" runat="server" Text='<%# Eval("NoteID") %>' />
                <br />
                NoteTitle:
                <asp:TextBox ID="NoteTitleTextBox" runat="server"
                    Text='<%# Bind("NoteTitle") %>' />
                <br />
                NoteContent:
                <asp:TextBox ID="NoteContentTextBox" runat="server"
                    Text='<%# Bind("NoteContent") %>' />
                <br />
                AddDateTime:
                <asp:TextBox ID="AddDateTimeTextBox" runat="server"
                    Text='<%# Bind("AddDateTime") %>' />
                <br />
                NoteUser:
                <asp:TextBox ID="NoteUserTextBox" runat="server"
                    Text='<%# Bind("NoteUser") %>' />
                <br />
                <asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True"
                    CommandName="Update" Text="更新" />
                &nbsp;<asp:LinkButton ID="UpdateCancelButton" runat="server"
                    CausesValidation="False" CommandName="Cancel" Text="取消" />
            </EditItemTemplate>
            <FooterStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
            <HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
            <HeaderTemplate>
                Add/Modify/View Note
            </HeaderTemplate>
            <InsertItemTemplate>
                NoteTitle:
                <asp:TextBox ID="NoteTitleTextBox" runat="server"
                    Text='<%# Bind("NoteTitle") %>' />
                <br />
                NoteContent:
                <asp:TextBox ID="NoteContentTextBox" runat="server"
                    Text='<%# Bind("NoteContent") %>' />
                <br />
                AddDateTime:
                <asp:TextBox ID="AddDateTimeTextBox" runat="server"
                    Text='<%# Bind("AddDateTime") %>' />
                <br />
                NoteUser:
                <asp:TextBox ID="NoteUserTextBox" runat="server"
                    Text='<%# Bind("NoteUser") %>' />
                <br />
                <asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True"
                    CommandName="Insert" Text="插入" />
                &nbsp;<asp:LinkButton ID="InsertCancelButton" runat="server"
                    CausesValidation="False" CommandName="Cancel"
                    onclick="InsertCancelButton_Click" Text="取消" />
            </InsertItemTemplate>
            <ItemTemplate>
                NoteID:
                <asp:Label ID="NoteIDLabel" runat="server" Text='<%# Eval("NoteID") %>' />
                <br />
                NoteTitle:
                <asp:Label ID="NoteTitleLabel" runat="server" Text='<%# Bind("NoteTitle") %>' />
                <br />
                NoteContent:
                <asp:Label ID="NoteContentLabel" runat="server"
                    Text='<%# Bind("NoteContent") %>' />
                <br />
                AddDateTime:
                <asp:Label ID="AddDateTimeLabel" runat="server"
                    Text='<%# Bind("AddDateTime") %>' />
                <br />
                NoteUser:
                <asp:Label ID="NoteUserLabel" runat="server" Text='<%# Bind("NoteUser") %>' />
                <br />
                <asp:LinkButton ID="EditButton" runat="server" CausesValidation="False"
                    CommandName="Edit" Text="编辑" />
                &nbsp;<asp:LinkButton ID="DeleteButton" runat="server" CausesValidation="False"
                    CommandName="Delete" Text="删除" />
                &nbsp;<asp:LinkButton ID="NewButton" runat="server" CausesValidation="False"
                    CommandName="New" Text="新建" />
            </ItemTemplate>
            <PagerStyle BackColor="#FFCC66" ForeColor="#333333" HorizontalAlign="Center" />
            <RowStyle BackColor="#FFFBD6" ForeColor="#333333" />
        </asp:FormView>

Code-Behind代码如下:

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace DataAccessingSample
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void ButtonAddNote_Click(object sender, EventArgs e)
        {
            this.FormViewNotes.Visible = true;
        }

        protected void InsertCancelButton_Click(object sender, EventArgs e)
        {
            this.FormViewNotes.Visible = false;
        }

        protected void FormViewNotes_ItemInserted(object sender, FormViewInsertedEventArgs e)
        {
            this.FormViewNotes.Visible = false;

        }
    }
}

最终页面运行如下,点击AddNote按钮,添加一些测试记录:



至此,我们的程序就完成了,不过细心的朋友可能会发现,在更新、删除的时候会出现一些无法删除的情况,至于为什么会出现这样的情况,可以仔细去查看生成的TableAdaptor类。

在DataSet中添加一个DeleteNote的方法,这个删除方法只传递一个删除的NoteID参数,重新设置ObjectDataSource即可:

<DeleteParameters>
                <asp:Parameter Name="NoteID" Type="Int32" />
            </DeleteParameters>

ObjectDataSource的属性设置为OldValuesParameterFormatString="{0}"而非OldValuesParameterFormatString="Original_{0}",为什么要这么做,大家可以思考下,因为我自己添加的删除方法的时候只有一个参数,否则就会找不到对应的方法了。

同理这样修改后,对于更新方法Update也需要自己手动的添加,否则也会出现类似下面的错误:

ObjectDataSource“ObjectDataSourceNotes”未能找到带参数的非泛型方法“Update”: NoteTitle, NoteContent, AddDateTime, NoteUser, Original_NoteID, Original_NoteTitle, Original_AddDateTime, Original_NoteUser, NoteID。

至于为什么VS自动生成的方法对于本文的Access数据库不适用了,可以详情参考自动生成的代码。

经过这样修改后,在页面测试删除成功(第二条已经删除掉):


如果需要本文的源码,请回复你的邮件,我会尽快发送到你的邮箱,谢谢。

本文为原创文章,如需转载,请注明转载地址,谢谢。

info Last modified by Raymond 11 years ago copyright This page is subject to Site terms.

Subscribe newsletter

Please log in or register to comment.

account_circle Log in person_add Register

Log in with external accounts

More from Kontext