在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;
}
}
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;
}
}
{
}
else if(GridView1.Columns[i] is TemplateField)
{
}
{
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();
}模板列是用户自己定义的列,所要显示的信息全由用户自己控制,系统是不能获得的,既然是自己赋给的,就自己去取吧。
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);
<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;
}
}
<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>
.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();
}
}
<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 是不同的
2.模板列里面的控件名与要绑定的列名一致,或者是放一个隐藏Label,Label.Text="要绑定的列名"。
这样在取的时候就去问控件要属性。
这就决定了把这个控件应用于任何一个GridView时就能够取得该GridView的各个列的DataField。
如果让数据源重新改成DataTable或者需要为每个模版列重命名或再添加一个隐藏控件等的话,也就无法将这个控件简单地应用于任何一个GridView了,
那也就违背了开发这个控件的初衷了。
因为你还得去改人家的数据源绑定方式,
或者去为每个模版列里的控件重命名,加隐藏控件(列多的话工程量还巨大)。可能就如13楼的哥们所说的,无法获取到模版列的DataField吧。多谢楼上各位仁兄,这个贴我过两天会结,到时送分啊,呵呵
如果查询的dt列和Gridview序号不对就悲剧喽