access_time 11 years ago language中文
more_vert

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

visibility 1,067 comment 0

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.
Like this article?
Share on

Please log in or register to comment.

account_circle Log in person_add Register

Log in with external accounts

Follow Kontext

Get our latest updates on LinkedIn.

Want to contribute on Kontext to help others?

Learn more

More from Kontext

visibility 567
thumb_up 0
access_time 5 months ago
visibility 34
thumb_up 0
access_time 8 months ago