在GridView的外部设置一个按钮,点击该按钮时如何能取到该GridView列所绑定的各个DataFiled的名称?
BoundField和TemplateField,尤其是如何取到TemplateField中的某控件所绑定的DataFiled的名称。
<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default8_CSDN.aspx.cs" Inherits="_Default8_CSDN" %><!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>Get GridView's HeaderText and the DataField</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button ID="Button1" runat="server" Text="Get GridView's DataField" OnClick="Button1_Click" />
        
        <p />
        
        <asp:Label ID="Label1" runat="server" Text=""></asp:Label>
        
        <p />
        
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
            <Columns>
                <asp:BoundField DataField="EmployeeID" HeaderText="ID" ReadOnly="True" />
                
                <asp:TemplateField HeaderText="Name">
                    <EditItemTemplate>
                        <asp:TextBox ID="gvtxtName" runat="server" Text='<%# Eval("EmployeeName") %>'></asp:TextBox>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="gvlbllName" runat="server" Text='<%# Bind("EmployeeName") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                
                <asp:BoundField DataField="EmployeeAge" HeaderText="Age" ReadOnly="True" />
            </Columns>
        </asp:GridView>
                
    </div>
    </form>
</body>
</html>
cs:using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls; public partial class _Default8_CSDN : System.Web.UI.Page 
{    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            GridView1.DataSource = GetTable();
            GridView1.DataBind();
        }
    }
 
    /// <summary> Button1 : 列出GridView的HeaderText和所绑定的DataField
    /// </summary>
    protected void Button1_Click(object sender, EventArgs e)
    {
        System.Text.StringBuilder sb = new System.Text.StringBuilder();        for (int i = 0; i < GridView1.Columns.Count; i++)
        {
            sb.Append("第" + (i+1).ToString() + "列 =========");
            sb.Append("HeaderText: ");
            sb.Append(GridView1.Columns[i].HeaderText);
            sb.Append("=========");
            sb.Append("DataField: ");
            sb.Append("???"); // 请问这里怎么写,望高手指教。
            sb.Append("<br/>");
        }        Label1.Text = sb.ToString();
    }    /// <summary> 创建DataTable
    /// </summary>
    /// <returns></returns>
    private DataTable GetTable()
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("EmployeeID");
        dt.Columns.Add("EmployeeName");
        dt.Columns.Add("EmployeeAge");        for (int i = 0; i < 5; i++)
        {
            dt.Rows.Add(new string[] { "ID" + i.ToString(), "Name" + i.ToString(), (i+20).ToString() });
        }
        return dt;
    } 
 
}

解决方案 »

  1.   

    ((BoundField)this.GridView1.Columns[0]).DataField
      

  2.   

    if(GridView1.Columns[i] is BoundField)
    {
    }
    else if(GridView1.Columns[i] is TemplateField)
    {
    }
      

  3.   

    我重新整理了一下    protected void Button1_Click(object sender, EventArgs e)
        {
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            DataTable dt = this.GetTable();        for (int i = 0; i < GridView1.Columns.Count; i++)
            {
                sb.Append("第" + (i + 1).ToString() + "列 =========");
                sb.Append("HeaderText: ");
                sb.Append(GridView1.Columns[i].HeaderText);
                sb.Append("=========");
                sb.Append("DataField: ");
                if (this.GridView1.Columns[i] is BoundField)
                {
                    sb.Append(((BoundField)this.GridView1.Columns[i]).DataField);
                }
                else if(this.GridView1.Columns[i] is TemplateField)
                {
                    sb.Append(dt.Columns[i].ColumnName);
                }
                sb.Append("<br/>");
            }        Label1.Text = sb.ToString();
        }模板列是用户自己定义的列,所要显示的信息全由用户自己控制,系统是不能获得的,既然是自己赋给的,就自己去取吧。
      

  4.   

    UP,
    sb.Append(dt.Columns[i].ColumnName);?????
    那不用if.else了,
         if (this.GridView1.Columns[i] is BoundField)
                {
                    sb.Append(((BoundField)this.GridView1.Columns[i]).DataField);
                }
                else if(this.GridView1.Columns[i] is TemplateField)
                {
                    sb.Append(dt.Columns[i].ColumnName);
                }
    直接
    sb.Append(dt.Columns[i].ColumnName);
      

  5.   

    首先先感谢楼上的各位热心的朋友们,特别是ycguo。发现BoundField是能成功取得的。但是如果GridView列为模版列的时候,上面的做法是把DataTable的列名来做为DataField的名字。这个是不对的,不是真正取到DataField的名称。把下面的代码重新运行一下就知道了。(改动的地方我用红色标出来了)。.aspx<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default8_CSDN.aspx.cs" Inherits="_Default8_CSDN" %><!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>Get GridView's HeaderText and the DataField</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:Button ID="Button1" runat="server" Text="Get GridView's DataField" OnClick="Button1_Click" />
            
            <p />
            
            <asp:Label ID="Label1" runat="server" Text=""></asp:Label>
            
            <p />
            
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
                <Columns>
                    <asp:BoundField DataField="EmployeeName" HeaderText="ID" ReadOnly="True" />
                    
                    <asp:TemplateField HeaderText="Name">
                        <EditItemTemplate>
                            <asp:TextBox ID="gvtxtName" runat="server" Text='<%# Eval("EmployeeAge") %>'></asp:TextBox>
                        </EditItemTemplate>
                        <ItemTemplate>
                            <asp:Label ID="gvlbllName" runat="server" Text='<%# Bind("EmployeeID") %>'></asp:Label>
                        </ItemTemplate>
                    </asp:TemplateField>
                    
                    <asp:BoundField DataField="EmployeeAge" HeaderText="Age" ReadOnly="True" />
                </Columns>
            </asp:GridView>
                    
        </div>
        </form>
    </body>
    </html>
    .csusing System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls; public partial class _Default8_CSDN : System.Web.UI.Page 
    {    protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                GridView1.DataSource = GetTable();
                GridView1.DataBind();
            }
        }
         /// <summary> Button1 : 列出GridView的HeaderText和所绑定的DataField
        /// </summary>
        protected void Button1_Click(object sender, EventArgs e)
        {
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            DataTable dt = this.GetTable();        for (int i = 0; i < GridView1.Columns.Count; i++)
            {
                sb.Append("第" + (i + 1).ToString() + "列 =========");
                sb.Append("HeaderText: ");
                sb.Append(GridView1.Columns[i].HeaderText);
                sb.Append("=========");
                sb.Append("DataField: ");
                if (this.GridView1.Columns[i] is BoundField)
                {
                    sb.Append(((BoundField)this.GridView1.Columns[i]).DataField);
                }
                else if (this.GridView1.Columns[i] is TemplateField)
                {
                    sb.Append(dt.Columns[i].ColumnName);
                }
                //sb.Append(dt.Columns[i].ColumnName);
                sb.Append("<br/>");
            }        Label1.Text = sb.ToString();
        }
        /// <summary> 创建DataTable
        /// </summary>
        /// <returns></returns>
        private DataTable GetTable()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("EmployeeID");
            dt.Columns.Add("EmployeeName");
            dt.Columns.Add("EmployeeAge");        for (int i = 0; i < 5; i++)
            {
                dt.Rows.Add(new string[] { "ID" + i.ToString(), "Name" + i.ToString(), (i+20).ToString() });
            }
            return dt;
        } 
     
    }
      

  6.   

    上面的html代码中红色突出不好用,重贴一下。<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default8_CSDN.aspx.cs" Inherits="_Default8_CSDN" %><!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>Get GridView's HeaderText and the DataField</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:Button ID="Button1" runat="server" Text="Get GridView's DataField" OnClick="Button1_Click" />
            
            <p />
            
            <asp:Label ID="Label1" runat="server" Text=""></asp:Label>
            
            <p />
            
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
                <Columns>
                    <asp:BoundField DataField="EmployeeName" HeaderText="ID" ReadOnly="True" />
                    
                    <asp:TemplateField HeaderText="Name">
                        <EditItemTemplate>
                            <asp:TextBox ID="gvtxtName" runat="server" Text='<%# Eval("EmployeeAge") %>'></asp:TextBox>
                        </EditItemTemplate>
                        <ItemTemplate>
                            <asp:Label ID="gvlbllName" runat="server" Text='<%# Bind("EmployeeID") %>'></asp:Label>
                        </ItemTemplate>
                    </asp:TemplateField>
                    
                    <asp:BoundField DataField="EmployeeAge" HeaderText="Age" ReadOnly="True" />
                </Columns>
            </asp:GridView>
                    
        </div>
        </form>
    </body>
    </html>
      

  7.   

    另外我现在的实际项目的情况是直接跟数据源绑定,就像以下的代码。.cs代码中,判断出来如果是模版列的情况下,代码应该如何写,还请高手帮忙完成一下,呵呵,先谢谢了:)
    .sqlcreate table kout_employee
    (
      k_employId varchar2(12)
    , k_employName varchar2(30)
    , k_employAge int
    )
    /insert into kout_employee values ('101', 'AAA', 21)

    insert into kout_employee values ('102', 'BBB', 22)

    insert into kout_employee values ('103', 'CCC', 23)

    insert into kout_employee values ('104', 'DDD', 24)

    insert into kout_employee values ('105', 'EEE', 25)
    / commit
    /.aspx<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default8_CSDN2.aspx.cs" Inherits="_Default8_CSDN2" %><!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>Get GridView's HeaderText and the DataField</title>
    </head>
    <body>
        <form id="form1" runat="server">
       
    <%--数据源--%> 
    <div>
        <asp:SqlDataSource ID="DataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
                            ProviderName="<%$ ConnectionStrings:ConnectionString.ProviderName %>" 
                            SelectCommand="
        SELECT 
              k_employId         
            , k_employName         
            , k_employAge         
        FROM
            kout_employee
    ">
        </asp:SqlDataSource>
    </div>
        <div>
            <asp:Button ID="Button1" runat="server" Text="Get GridView's DataField" OnClick="Button1_Click" />
            
            <p />
            
            <asp:Label ID="Label1" runat="server" Text=""></asp:Label>
            
            <p />
            
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="DataSource1">
                <Columns>
                    <asp:BoundField DataField="k_employId" HeaderText="ID" ReadOnly="True" />
                    
                    <asp:TemplateField HeaderText="Name">
                        <EditItemTemplate>
                            <asp:TextBox ID="gvtxtName" runat="server" Text='<%# Eval("k_employName") %>'></asp:TextBox>
                        </EditItemTemplate>
                        <ItemTemplate>
                            <asp:Label ID="gvlbllName" runat="server" Text='<%# Bind("k_employName") %>'></asp:Label>
                        </ItemTemplate>
                    </asp:TemplateField>
                    
                    <asp:BoundField DataField="k_employAge" HeaderText="Age" ReadOnly="True" />
                </Columns>
            </asp:GridView>
        </div>
        </form>
    </body>
    </html>.csusing System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls; public partial class _Default8_CSDN2 : System.Web.UI.Page 
    {    protected void Page_Load(object sender, EventArgs e)
        {    }    /// <summary> Button1 : 列出GridView的HeaderText和所绑定的DataField
        /// </summary>
        protected void Button1_Click(object sender, EventArgs e)
        {
            System.Text.StringBuilder sb = new System.Text.StringBuilder();        for (int i = 0; i < GridView1.Columns.Count; i++)
            {
                sb.Append("第" + (i + 1).ToString() + "列 =========");
                sb.Append("HeaderText: ");
                sb.Append(GridView1.Columns[i].HeaderText);
                sb.Append("=========");
                sb.Append("DataField: ");
                if (this.GridView1.Columns[i] is BoundField)
                {
                    sb.Append(((BoundField)this.GridView1.Columns[i]).DataField);
                }
                else if (this.GridView1.Columns[i] is TemplateField)
                {
                    // 这里怎么写,请高手指教,谢谢啊!
                }
                sb.Append("<br/>");
            }        Label1.Text = sb.ToString();
        }
     
    }
      

  8.   


                        <ItemTemplate>
                            <asp:Label ID="gvlbllName" runat="server" Text='<%# Bind("k_employName") %>'></asp:Label>
                        </ItemTemplate>按我理解的,这个自定义绑定语法 Bind 或者 Eval 函数中的 属性名,如这里的 k_employName 应该无法通过代码模型取得的!因为 Bind 或者 Eval 实际上是经过 asp.net 解析器解析成 C#/VB.net ... 代码的,与 BoundField.DataField 是不同的
      

  9.   

    顶13楼, <%# Bind("k_employName") %>实际就是你手写调用了后台方法,参数"k_employName"也是你手写定义的,既然写死了,就写死到底吧。如果一定要动态去取,两个方案,1.事先将数据源的列顺序排好,不要打乱,直接调dt.Columns[i].ColumnName;
    2.模板列里面的控件名与要绑定的列名一致,或者是放一个隐藏Label,Label.Text="要绑定的列名"。
    这样在取的时候就去问控件要属性。
      

  10.   

    顶13楼和15楼,呵呵因为现在在开发一个GridView控件,需要用到上面提到的获取DataField名称的功能。
    这就决定了把这个控件应用于任何一个GridView时就能够取得该GridView的各个列的DataField。
    如果让数据源重新改成DataTable或者需要为每个模版列重命名或再添加一个隐藏控件等的话,也就无法将这个控件简单地应用于任何一个GridView了,
    那也就违背了开发这个控件的初衷了。
    因为你还得去改人家的数据源绑定方式,
    或者去为每个模版列里的控件重命名,加隐藏控件(列多的话工程量还巨大)。可能就如13楼的哥们所说的,无法获取到模版列的DataField吧。多谢楼上各位仁兄,这个贴我过两天会结,到时送分啊,呵呵
      

  11.   

    可能就如13楼的哥们所说的,无法获取到模版列的DataField吧。=========此时根本就没有所谓的 DataField , 你有看到嘛?  Bind 和 Eval 实际上是函数。
      

  12.   

    dt.Columns[i].ColumnName
    如果查询的dt列和Gridview序号不对就悲剧喽