不多说 贴代码先ASPX 代码如下
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="temp.aspx.cs" Inherits="WebForm_temp" EnableViewState ="true" %><!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 id="Head1" runat="server">
    <link href="../BaseCSS.css" rel="stylesheet" type="text/css" />
    <title>无标题页</title>
</head>
<body>
    <form id="form1" runat="server">    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    <div>        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
            BackColor="White" BorderColor="#999999" BorderStyle="None" BorderWidth="1px" 
            CellPadding="3" GridLines="Vertical" 
            onrowdatabound="GridView1_RowDataBound" onrowcreated="GridView1_RowCreated">        </asp:GridView>
    </div>
    <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
    
    
    </form>
</body>
</html>CS 代码如下
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 AjaxControlToolkit;public partial class WebForm_temp : System.Web.UI.Page
{
    ClassCommon MyClassCommon = new ClassCommon();    DataTable MyDataTable = new DataTable();    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            GvDataBind();
        }
    }
    protected void GvDataBind()
    {
//读取数据到mydatatable  这个表含3列 ->  ID,AA,BB  测试用        MyClassCommon.SqlFillDataTable("select * from poohr.dbo.表", MyClassCommon.Str_db_sql_connection, MyDataTable);        this.GridView1.Columns.Clear();
        for (int i = 0; i < MyDataTable.Columns.Count; i++)
        {
            TemplateField customField = new TemplateField();
            customField.ShowHeader = true;
            //customField.HeaderTemplate = new GridViewTemplate(DataControlRowType.Header, MyDataTable.Columns[i].Caption.ToString());            customField.HeaderText = MyDataTable.Columns[i].Caption.ToString();
            if (customField.HeaderText.ToString().ToLower() != "id")
            {
                customField.ItemTemplate = new GridViewTemplate(DataControlRowType.DataRow, MyDataTable.Columns[i].Caption.ToString(), i);
                GridView1.Columns.Add(customField);
            }
            else
            {
                BoundField bf1 = new BoundField();
                bf1.DataField = "id";
                bf1.HeaderText = "id";
                GridView1.Columns.Add(bf1);
            }
        }
        this.GridView1.DataSource = MyDataTable;
        this.GridView1.DataBind();
    }    //以下是根据孟子E章更改的数据(设定动态列的东西,由于存在2列Dropdown所以加了一个 参数)    public class GridViewTemplate : ITemplate
    {
        private DataControlRowType templateType;
        private string columnName;
        private int iCols;        public GridViewTemplate(DataControlRowType type, string colname, int iCol)
        {
            templateType = type;
            columnName = colname;
            iCols = iCol;
        }        public void InstantiateIn(System.Web.UI.Control container)
        {
            switch (templateType)
            {
                case DataControlRowType.Header:
                    Literal lc = new Literal();
                    lc.Text = columnName;
                    container.Controls.Add(lc);
                    break;
                case DataControlRowType.DataRow:                    DropDownList drr = new DropDownList();                    drr.ID = "dropdown" + iCols.ToString();
                    drr.AppendDataBoundItems = true;
                    drr.Items.Add(new ListItem("AA", "a"));
                    drr.Items.Add(new ListItem("BB", "b"));
                    drr.Items.Add(new ListItem("CC", "c"));                    container.Controls.Add(drr);
                    break;
                default:
                    break;
            }
        }
    }
    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            System.Data.DataRowView drv = (System.Data.DataRowView)e.Row.DataItem;
            for (int i = 0; i < e.Row.Cells.Count; i++)
            {
                DropDownList ddl = (DropDownList)e.Row.FindControl("dropdown" + i.ToString());
                if (ddl != null)
                {
                    try
                    {
                        //这边初始化成功!!!
ddl.Items.FindByText(drv[i].ToString()).Selected = true;
                    }
                    catch
                    { }
                }
            }        }
    }    protected void Button1_Click(object sender, EventArgs e)
    {
        string SqlUpdateStr = "";
        foreach (GridViewRow gvr in GridView1.Rows)
        {
            for (int i = 0; i < gvr.Cells.Count; i++)
            {
                DropDownList dd = (DropDownList)gvr.FindControl("dropdown" + i.ToString());    //关键是在于这边找不到该控件!!
                if (dd != null)
                {
                    SqlUpdateStr += dd.SelectedItem.Text.ToString();  //找到该控件
                }
                else
                {
                    SqlUpdateStr += gvr.Cells[i].Text.ToString();
                }
            }
            SqlUpdateStr +="";
        }
        this.Label1.Text = SqlUpdateStr ;
        //Response.Redirect(Request.UrlReferrer.ToString());
        GvDataBind();    }
}

解决方案 »

  1.   

    测试了如果是在ASPX里添加的列        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" BackColor="White"
                BorderColor="#999999" BorderStyle="None" BorderWidth="1px" CellPadding="3" GridLines="Vertical"
                OnRowDataBound="GridView1_RowDataBound" OnRowCreated="GridView1_RowCreated">
                <Columns>
                    <asp:TemplateField>
                        <ItemTemplate>
                            <asp:DropDownList ID="dropdown0" runat="server">
                                <asp:ListItem Text ="AA" Value="AA"> 
                                </asp:ListItem>
                            </asp:DropDownList>
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>就找的到这个值!!!!
      

  2.   

    GridView1.Rows[0].Cells[0].FindControl("") as DropDownList 
    gvr.FindControl("dropdown1") as DropDownList 试试
      

  3.   

    我的表就是这样的id aa bb
    1 AA BB
    2 AA BB
    3 BB AA
      

  4.   


    up
    支持LZ严谨的治学精神

    jf
      

  5.   

    前台生成的代码是 ASPX里定义的模板列是一模一样的
    问题依旧期望孟子
      

  6.   

    换个用户自己顶一下找到原因了把    protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                GvDataBind();
            }
        }
    改成
        protected void Page_Load(object sender, EventArgs e)
        {
                GvDataBind();
        }
    这样的话 就会提取的到值但是 变成 这个过程在第2次GvDataBind() 时就是提取页面上的数据不知道为什么 这种.NET的机制实在是搞不清有了解意思的解释下 为什么 动态模板列 要每次PAGE_LOAD时都要 加载一下吗?而且理论上说 我的加载是有根据数据库表,初始化数据的那为什么 BUTTON1 的提交 后, PAGE_LOAD竟然是提取到 现有页面上的值
    期待高人......
      

  7.   

    解决不了这个问题理论上说
    gvdatabind 直接放在PAGE_LOAD每次都会从数据表里提取 原来的值如果啥都没做的话
    应该GRIDVIEW值 又返回原有数据表状态了但是实际上点了
    BUTTON1 的话, 取到了页面上的值同时 页面重新gvdatabind 只是绑定了数据列, 而数据列 并没有被原始数据表更新掉保留了原有的值 EnableViewState="true"  这个设成 false
    也是一样相当于    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                System.Data.DataRowView drv = (System.Data.DataRowView)e.Row.DataItem;
                for (int i = 0; i < e.Row.Cells.Count; i++)
                {
                    DropDownList ddl = (DropDownList)e.Row.FindControl("dropdown" + i.ToString());
                    if (ddl != null)
                    {
                        try
                        {
                            //这边初始化成功!!!
                ddl.Items.FindByText(drv[i].ToString()).Selected = true;
                        }
                        catch
                        { }
                    }
                }        }
        }
    这个过程 并没有 提取原始值
    但是 实际上 调试单步时 执行了 
                ddl.Items.FindByText(drv[i].ToString()).Selected = true;不知所以然
      

  8.   

    总结一下这种添加模板列的方式,必须是要在PAGE_LOAD里重新建立一下数据,同时绑定数据
      

  9.   

    感觉CSDN的氛围真不行
    都是粘来粘去的
    贴子原创的太少太少没啥重要作用