对于 GridView 我是一无所知,今天下午摸索了一下午,总算把 新增,删除,修改给弄通了。
首先,GridView 没有 新增功能,要模拟出这个功能,需要结合 GridView 的 EmptyDataTemplate 和 DetailsView 来做。EmptyDataTemplate 是当 dataSource 没有记录可显示的时候 要显示的东东。DetailsView 有 新增功能。一开始我考虑用 FooterTemplate 来做新增,但是做好之后发现当没有记录可显示的时候, FooterTemplate 根本就不显示。
Insert 和 Update 的问题解决了,但是 Delete 却把我给难住了,设了 ObjectDataSource 对象的 DeleteMethod 之后,一直提示我:ObjectDataSource 'ObjectDataSource1' could not find a non-generic method 'delete' that has no parameters.
查了查MSDN,看到有个 <DeleteParameters>,就照着写了一个,但是传到 Delete 方法里,却得不到要删除的ID,翻了N多网页,也没有找到所以然,后来看到一遍 GridView 72般绝技里有提到 GridView 的 onrowdeleting事件里处理删除,才用一种变通的方法把 Delete 给解决了。
<%@ Page Title="" Language="C#" MasterPageFile="~/admin.master" AutoEventWireup="true" CodeFile="Admin_ProductVideoSource.aspx.cs" Inherits="Admin_Admin_ProductVideoSource" %>
<asp:Content ID="Content1" ContentPlaceHolderID="AdminPlaceHolder" Runat="Server">
<asp:GridView ID="gd" runat="server" AutoGenerateColumns="False"
AllowPaging="True"
DataSourceID="ObjectDataSource1"
onrowcommand="gd_RowCommand"
Width="650px"
<asp:GridView ID="gd" runat="server" AutoGenerateColumns="False"
AllowPaging="True"
DataSourceID="ObjectDataSource1"
onrowcommand="gd_RowCommand"
Width="650px"
onrowdeleting="gd_RowDeleting"
>
<Columns>
<asp:TemplateField HeaderText="ID">
<InsertItemTemplate>
<asp:Label ID="lblID" runat="server" Text='<%#Bind("ID")%>'></asp:Label>
</InsertItemTemplate>
<EditItemTemplate>
<asp:Label ID="lblID" runat="server" Text='<%#Bind("ID")%>'></asp:Label>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="lblID" runat="server" Text='<%#Eval("ID")%>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Name">
<InsertItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Name") %>'></asp:TextBox>
</InsertItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Name") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("Name") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Code">
<InsertItemTemplate>
<asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("Code") %>' TextMode="MultiLine" Rows="10" Columns="70"></asp:TextBox>
</InsertItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("Code") %>' TextMode="MultiLine" Rows="10" Columns="70"></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:TextBox ID="Label2" runat="server" Text='<%# Bind("Code") %>' TextMode="MultiLine" Rows="5" Columns="70"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
>
<Columns>
<asp:TemplateField HeaderText="ID">
<InsertItemTemplate>
<asp:Label ID="lblID" runat="server" Text='<%#Bind("ID")%>'></asp:Label>
</InsertItemTemplate>
<EditItemTemplate>
<asp:Label ID="lblID" runat="server" Text='<%#Bind("ID")%>'></asp:Label>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="lblID" runat="server" Text='<%#Eval("ID")%>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Name">
<InsertItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Name") %>'></asp:TextBox>
</InsertItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Name") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("Name") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Code">
<InsertItemTemplate>
<asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("Code") %>' TextMode="MultiLine" Rows="10" Columns="70"></asp:TextBox>
</InsertItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("Code") %>' TextMode="MultiLine" Rows="10" Columns="70"></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:TextBox ID="Label2" runat="server" Text='<%# Bind("Code") %>' TextMode="MultiLine" Rows="5" Columns="70"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:CommandField ShowEditButton="True" ShowDeleteButton="true"
ShowInsertButton="True" />
</Columns>
<EmptyDataTemplate>
Insert Record:
<asp:DetailsView ID="dtlView1" runat="server" AutoGenerateRows="False"
DefaultMode="Insert" DataSourceID="ObjectDataSource1">
<Fields>
<asp:TemplateField FooterText="Name" HeaderText="Name">
<InsertItemTemplate>
<asp:TextBox ID="empName" runat="server" Text='<%# Bind("Name") %>'></asp:TextBox>
</InsertItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Code">
<InsertItemTemplate>
<asp:TextBox ID="empCode" runat="server" Text='<%# Bind("Code") %>' TextMode="MultiLine" Rows="5" Columns="70"></asp:TextBox>
</InsertItemTemplate>
</asp:TemplateField>
<asp:ButtonField CommandName="Insert" HeaderText="Insert" Text="Insert" />
</Fields>
</asp:DetailsView>
</EmptyDataTemplate>
</asp:GridView>
ShowInsertButton="True" />
</Columns>
<EmptyDataTemplate>
Insert Record:
<asp:DetailsView ID="dtlView1" runat="server" AutoGenerateRows="False"
DefaultMode="Insert" DataSourceID="ObjectDataSource1">
<Fields>
<asp:TemplateField FooterText="Name" HeaderText="Name">
<InsertItemTemplate>
<asp:TextBox ID="empName" runat="server" Text='<%# Bind("Name") %>'></asp:TextBox>
</InsertItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Code">
<InsertItemTemplate>
<asp:TextBox ID="empCode" runat="server" Text='<%# Bind("Code") %>' TextMode="MultiLine" Rows="5" Columns="70"></asp:TextBox>
</InsertItemTemplate>
</asp:TemplateField>
<asp:ButtonField CommandName="Insert" HeaderText="Insert" Text="Insert" />
</Fields>
</asp:DetailsView>
</EmptyDataTemplate>
</asp:GridView>
<asp:ObjectDataSource
ID="ObjectDataSource1"
runat="server"
TypeName="Commerce.Common.ProductVideoSourceController"
InsertMethod="Insert"
SelectMethod="GetAll"
UpdateMethod="update"
DeleteMethod="delete"
OnDeleting="ObjectDataSource_onDeleting"
>
<DeleteParameters>
</DeleteParameters>
</asp:ObjectDataSource>
</asp:Content>
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Commerce.Common;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Commerce.Common;
public partial class Admin_Admin_ProductVideoSource : System.Web.UI.Page{
protected void Page_Load(object sender, EventArgs e) {
protected void Page_Load(object sender, EventArgs e) {
}
protected void gd_RowCommand(object sender, GridViewCommandEventArgs e) {
switch(e.CommandName){
case "New"://GridView not support New
gd.DataSourceID = "";
gd.DataBind();
break;
}
}
switch(e.CommandName){
case "New"://GridView not support New
gd.DataSourceID = "";
gd.DataBind();
break;
}
}
public void ObjectDataSource_onDeleting(object source, ObjectDataSourceMethodEventArgs e) {
}
protected void gd_RowDeleting(object sender, GridViewDeleteEventArgs e) {
Parameter pm = new Parameter();
pm.Name = "ID";
pm.DbType = System.Data.DbType.Int32;
pm.DefaultValue = ((Label)gd.Rows[e.RowIndex].FindControl("lblID")).Text;
ObjectDataSource1.DeleteParameters.Add(pm);
}
}
Parameter pm = new Parameter();
pm.Name = "ID";
pm.DbType = System.Data.DbType.Int32;
pm.DefaultValue = ((Label)gd.Rows[e.RowIndex].FindControl("lblID")).Text;
ObjectDataSource1.DeleteParameters.Add(pm);
}
}
先看上面那个 ObjectDataSource1 的 TypeName,开始我在 Page_load 里写:
gd.TypeName="ProductVideoSourceController";
提示找不到 ProductVideoSourceController,我引用了这个类的 NameSpace 也不行,后来把 Namespace 都加在 TypeName 里才通过。即:
TypeName="Commerce.Common.ProductVideoSourceController"
GridView 里的 InsertItemTemplate 在这里根本就没有任何作用,网上的文章都说 GridView 没有 新增的功能,
<asp:CommandField ShowEditButton="True" ShowDeleteButton="true" ShowInsertButton="True" />
指示GridView 每行都有 DeleteButton, InsertButton, EditButton , 运行后,点EditButton 会把 EditItemTemplate 所设置的内容显示出来,但是点那个 InsertButton 却没有任何反应,即 InsertItemTemplate 不起作用。
为了达到新增的功能,我在GridView 的 onrowcommand 事件里判断 CommandName,如果是 New ,就把 GridView 的 DataSourceID 设为空,这样 GridView 就没有数据可显示,就会显示 EmptyTemplate 里的内容,即 DetailsView,具体见上面的:gd_RowCommand 这个方法。
前面说 Delete 的时候在要执行的方法里得不到要删除的ID,我在GridView 的 onrowdeleting 事件里先取出当前所在的行 ,然后在 FindControl 含有 ID 的那个控件,把它的值填到 一个 Parameter 对象里,在把这个 Parameter 对象 Add 到 ObjectDataSource 的 DeleteParameters 里,具体见:gd_RowDeleting 方法。
| < Prev | Next > |
|---|
Last Updated ( Thursday, 16 April 2009 08:37 )



