none
GridView编辑状态时动态添加DropDownList控件,返回“未能加载视图状态”的问题 RRS feed

  • 问题

  • 我在GridView编辑状态时,删除了某一个cell的textbox,动态添加DropDownList了控件,现在需要添加DropDownList的SelectedIndexChanged事件,以便选择后利用GridView更新把选择的数据输入到数据库中。在添加后出现“未能加载视图状态”的提示,应该如何做?

    =====================
    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="商品管理.aspx.cs" Inherits="网站.admin.商城.商品管理" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>商品管理</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
       
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
                onrowediting="GridView1_RowEditing"
                onrowcancelingedit="GridView1_RowCancelingEdit"
                onrowupdating="GridView1_RowUpdating">
                <Columns>
                    <asp:CommandField ShowEditButton="True" />
                    <asp:CommandField ShowDeleteButton="True" />
                    <asp:BoundField DataField="商品编号" DataFormatString="{0:d}" HeaderText="商品编号" />
                    <asp:BoundField DataField="商品类别名称" HeaderText="商品类别名称" />
                    <asp:BoundField DataField="商品名称" HeaderText="商品名称" />
                    <asp:ImageField DataImageUrlField="商品小图地址" HeaderText="商品小图">
                    </asp:ImageField>
                    <asp:ImageField DataImageUrlField="商品大图地址" HeaderText="商品大图">
                    </asp:ImageField>
                    <asp:BoundField DataField="商品规格" HeaderText="商品规格" />
                    <asp:BoundField DataField="商品面料" HeaderText="商品面料" />
                    <asp:BoundField DataField="商品A价" DataFormatString="{0:c}" HeaderText="商品A价" />
                    <asp:BoundField DataField="商品B价" DataFormatString="{0:c}" HeaderText="商品B价" />
                    <asp:CheckBoxField DataField="是否精品" HeaderText="是否精品" />
                </Columns>
            </asp:GridView>
       
        </div>
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
        <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
        </form>
        </body>
    </html>



    =============================================================

    using System;
    using System.Collections;
    using System.Configuration;
    using System.Data;
    using System.Linq;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Xml.Linq;
    using 商城;

    namespace 网站.admin.商城
    {
        public partial class 商品管理 : System.Web.UI.Page
        {
         
         

            protected void Page_Load(object sender, EventArgs e)
            {
         
                    管理商品();     
            }

            protected void 管理商品()
            {
                商品 商品1 = new 商品();
                商品1.数据库连接字符串 = ConfigurationManager.ConnectionStrings["网站ConnectionString"].ToString();
                商品1.管理商品存储过程名 = "管理商品存储过程";

                GridView1.DataSource = 商品1.管理商品();
                GridView1.DataBind();
            }

            protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
            {
                GridView1.EditIndex = e.NewEditIndex;
                管理商品();
                /*
                商品 商品1 = new 商品();
                商品1.数据库连接字符串 = ConfigurationManager.ConnectionStrings["网站ConnectionString"].ToString();
                商品1.管理商品存储过程名 = "管理商品存储过程";

                GridView1.DataSource = 商品1.管理商品();
                GridView1.DataBind();
                */
                //TextBox 商品名称 = (TextBox)GridView1.Rows[GridView1.EditIndex].FindControl("商品名称");
                //GridView1.Rows[GridView1.EditIndex].Cells[1].Controls[0].Visible = false;
                //GridView1.Rows[GridView1.EditIndex].Cells[6].Controls[0].Visible = false;
                ((TextBox)GridView1.Rows[GridView1.EditIndex].Cells[2].Controls[0]).ReadOnly = true;

                GridView1.Rows[GridView1.EditIndex].Cells[3].Controls.Clear();

                DropDownList 商品分类 = new DropDownList();
                商品分类.ID = "商品分类";
                商品分类.EnableViewState = true;
                商品分类.AutoPostBack = true;
                商品分类.SelectedIndexChanged += new EventHandler(商品分类_SelectedIndexChanged);


                商品类别 商品类别1 = new 商品类别();
                商品类别1.数据库连接字符串 = ConfigurationManager.ConnectionStrings["网站ConnectionString"].ToString();
                商品类别1.列出第一级商品类别存储过程名 = "列出第一级商品类别存储过程";
                商品类别1.列出该级下的商品类别存储过程名 = "列出该级下的商品类别存储过程";
                商品分类.DataSource = 商品类别1.列出所有商品类别();
                商品分类.DataTextField = "商品类别名称";
                商品分类.DataValueField = "商品类别编号";
                商品分类.DataBind();
                商品类别1.清空输出表();

                GridView1.Rows[GridView1.EditIndex].Cells[5].Controls.Clear();
                GridView1.Rows[GridView1.EditIndex].Cells[6].Controls.Clear();

                GridView1.Rows[GridView1.EditIndex].Cells[3].Controls.Add(商品分类);

                //GridView1.Rows[GridView1.EditIndex].Cells[6].Style=;
                FileUpload 小图上传 = new FileUpload();
                小图上传.EnableViewState = true;
                FileUpload 大图上传 = new FileUpload();
                大图上传.EnableViewState = true;
                //大图上传.Width = 120;
                //大图上传.Height = 30;
                GridView1.Rows[GridView1.EditIndex].Cells[5].Controls.Add(小图上传);
                GridView1.Rows[GridView1.EditIndex].Cells[6].Controls.Add(大图上传);
                //GridView1.Rows[GridView1.EditIndex].Cells[6].ControlStyle.Height = Unit.Pixel(10);
                //大图上传.Height = 30;
                //Label1.Text = ((TextBox)GridView1.Rows[GridView1.EditIndex].Cells[6].Controls[0]).Text;
              // GridView1.Rows[GridView1.EditIndex].Cells[6].Controls[0].SkinID.
            }

            protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
            {
                GridView1.EditIndex = -1;
                管理商品();
            }

            protected void Button1_Click(object sender, EventArgs e)
            {
             
            }

            protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
            {
                //Label1.Text=商品分类.SelectedItem.ToString();
                //Label1.Text = GridView1.Rows[e.RowIndex].Cells[8].Text;
                //管理商品();
            }


            protected void 商品分类_SelectedIndexChanged(object sender, EventArgs e)
            {

                DropDownList 商品分类 = (DropDownList)sender;

                Label1.Text = 商品分类.SelectedItem.ToString();

               
            }


        }
    }
    <!-- google_ad_section_end --><!--End_body//-->
     
     
    2010年1月28日 7:02

答案

  • 你好,

    怎么得到Dropdownlist的选取值可以参考下面的方案。下面的方法从被更新的行的第五个cell中通过调用FindControl来找到那个dropdownlist。
    <%@ Page Language="C#" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <script runat="server">
    
       
        protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
          
           DropDownList ddl= this.GridView1.Rows[e.RowIndex].Cells[5].FindControl("DropDownList1") as DropDownList;
           Response.Write(ddl.SelectedValue);
        }
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
        
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
                DataKeyNames="Id" DataSourceID="SqlDataSource1" 
                onrowupdating="GridView1_RowUpdating" AllowPaging="True" HorizontalAlign="Left" 
                PageSize="5">
                <Columns>
                    <asp:CommandField ShowEditButton="True" />
                    <asp:BoundField DataField="Id" HeaderText="Id" InsertVisible="False" 
                        ReadOnly="True" SortExpression="Id" />
                    <asp:BoundField DataField="ImageName" HeaderText="ImageName" 
                        SortExpression="ImageName" />
                    <asp:BoundField DataField="Des" HeaderText="Des" SortExpression="Des" />
                    <asp:BoundField DataField="Path" HeaderText="Path" SortExpression="Path" />
                    <asp:TemplateField HeaderText="CategoryId" SortExpression="CategoryId">
                        <ItemTemplate>
                            <asp:Label ID="Label1" runat="server" Text='<%# Bind("CategoryId") %>'></asp:Label>
                        </ItemTemplate>
                        <EditItemTemplate>
                            <%--<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("CategoryId") %>'></asp:TextBox>--%>
                            <asp:DropDownList ID="DropDownList1" runat="server" 
                                SelectedValue='<%# Bind("CategoryId") %>' DataSourceID="SqlDataSource1" 
                                DataTextField="Name" DataValueField="Id">
                            </asp:DropDownList>
                            <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
                                ConnectionString="<%$ ConnectionStrings:test_EmployeeInfo_SKConnectionString %>" 
                                SelectCommand="SELECT * FROM [Category]"></asp:SqlDataSource>
                        </EditItemTemplate>
                    </asp:TemplateField>
                    <asp:CommandField ShowDeleteButton="True" />
                </Columns>
            </asp:GridView>
            <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
                ConnectionString="<%$ ConnectionStrings:test_EmployeeInfo_SKConnectionString2 %>" 
                SelectCommand="SELECT * FROM [Images]"></asp:SqlDataSource>
       
        </div>
        </form>
    </body>
    </html>
    

    Microsoft Online Community Support
    2010年2月1日 2:32

全部回复

  • 你做这些东西 用了很多中文取名造成很多bug   建议你更改一下换成英文名称

    2010年1月28日 7:30
  • 你好,

    你这样是无法实现这个DropDownList的SelectedIndexChanged事件的。

    因为这个控件和这个事件是你自己动态添加的,所以postback后gridview会根据自己的数据源再创建控件层次结构,这样就又恢复到初始的状态。

    所以你的需求就无法实现了。

    GridView有几个模板,如ItemTemplate和EditItemplate。ItemTemplate用来正常显示数据,而EditItemplate是用来编辑的。

    所以你的功能是可以用模板列来实现的,具体的可以参考下面的连接。
    http://kb.cnblogs.com/a/532211/

    http://www.cnblogs.com/zjz008/archive/2009/09/22/1571531.html
    Microsoft Online Community Support
    2010年1月29日 2:14
  • 你好,

    你这样是无法实现这个DropDownList的SelectedIndexChanged事件的。

    因为这个控件和这个事件是你自己动态添加的,所以postback后gridview会根据自己的数据源再创建控件层次结构,这样就又恢复到初始的状态。

    所以你的需求就无法实现了。

    GridView有几个模板,如ItemTemplate和EditItemplate。ItemTemplate用来正常显示数据,而EditItemplate是用来编辑的。

    所以你的功能是可以用模板列来实现的,具体的可以参考下面的连接。
    http://kb.cnblogs.com/a/532211/

    http://www.cnblogs.com/zjz008/archive/2009/09/22/1571531.html
    Microsoft Online Community Support
    谢谢你,我用了模板页,但是我在后台.cs文件中为何无法取到EditItemplate中DropDownList的选取值?后台好像不认这个控件?这样我就无法得到DropDownList的选取值,我的GridView更新也就无法实现?
    我的需求实际上是GridView在编辑时其中一个格子变成下拉菜单供选择,最后执行更新。
    2010年1月30日 2:25
  • 你好,

    怎么得到Dropdownlist的选取值可以参考下面的方案。下面的方法从被更新的行的第五个cell中通过调用FindControl来找到那个dropdownlist。
    <%@ Page Language="C#" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <script runat="server">
    
       
        protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
          
           DropDownList ddl= this.GridView1.Rows[e.RowIndex].Cells[5].FindControl("DropDownList1") as DropDownList;
           Response.Write(ddl.SelectedValue);
        }
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
        
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
                DataKeyNames="Id" DataSourceID="SqlDataSource1" 
                onrowupdating="GridView1_RowUpdating" AllowPaging="True" HorizontalAlign="Left" 
                PageSize="5">
                <Columns>
                    <asp:CommandField ShowEditButton="True" />
                    <asp:BoundField DataField="Id" HeaderText="Id" InsertVisible="False" 
                        ReadOnly="True" SortExpression="Id" />
                    <asp:BoundField DataField="ImageName" HeaderText="ImageName" 
                        SortExpression="ImageName" />
                    <asp:BoundField DataField="Des" HeaderText="Des" SortExpression="Des" />
                    <asp:BoundField DataField="Path" HeaderText="Path" SortExpression="Path" />
                    <asp:TemplateField HeaderText="CategoryId" SortExpression="CategoryId">
                        <ItemTemplate>
                            <asp:Label ID="Label1" runat="server" Text='<%# Bind("CategoryId") %>'></asp:Label>
                        </ItemTemplate>
                        <EditItemTemplate>
                            <%--<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("CategoryId") %>'></asp:TextBox>--%>
                            <asp:DropDownList ID="DropDownList1" runat="server" 
                                SelectedValue='<%# Bind("CategoryId") %>' DataSourceID="SqlDataSource1" 
                                DataTextField="Name" DataValueField="Id">
                            </asp:DropDownList>
                            <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
                                ConnectionString="<%$ ConnectionStrings:test_EmployeeInfo_SKConnectionString %>" 
                                SelectCommand="SELECT * FROM [Category]"></asp:SqlDataSource>
                        </EditItemTemplate>
                    </asp:TemplateField>
                    <asp:CommandField ShowDeleteButton="True" />
                </Columns>
            </asp:GridView>
            <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
                ConnectionString="<%$ ConnectionStrings:test_EmployeeInfo_SKConnectionString2 %>" 
                SelectCommand="SELECT * FROM [Images]"></asp:SqlDataSource>
       
        </div>
        </form>
    </body>
    </html>
    

    Microsoft Online Community Support
    2010年2月1日 2:32