给梦一个奔跑的方向!
PDF Print E-mail
User Rating: / 6
PoorBest 
Written by xlingfairy
Wednesday, 15 April 2009 23:33
对于 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"
        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>
            <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>

    <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;
public partial class Admin_Admin_ProductVideoSource : System.Web.UI.Page{
    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;

        }
    }
    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);

    }
}
 
 
先看上面那个 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 方法。
Last Updated ( Thursday, 16 April 2009 08:37 )
 

Add comment


Security code
Refresh

Popular Contents

Recommend

Site Info

Members : 1
Content : 100
Web Links : 7
Content View Hits : 56500

Links