怎样才能得到DATAGRID各列的页眉文本?
当DATAGRID绑定之后,用DataGrid.Columns.Count得到值为0,但用DataGrid.Items(index).Cells(index).Text可以得到相应的单元格数据,有什么办法能够得到DataGrid.Columns(i).HeaderText 的内容呢?注:因为DATEVIEW中TABLE的列数不定,所以不能将AutoGenerateColumns设置为False。
我是想在Page.IsPostBack 之后,取得Columns(i).HeaderText的值,不想再次连到数据库中去找TABLE的字段名了。
问题点数:200、回复次数:30Top
1 楼LoveCherry(论成败,人生豪迈;大不了,重头再来!^_^)回复于 2005-11-01 16:45:42 得分 5
东西都已经现出来了直接通过js读页面table的数据Top
2 楼liuredstar(Flying)回复于 2005-11-01 16:46:05 得分 2
for(int i=0;i < DataGrid.Columns.Count-1;i++)
{
string HeaderText = DataGrid.Columns[i].HeaderText;
}Top
3 楼pontus(pontus)回复于 2005-11-01 16:47:37 得分 2
得到HeaderItem啊
HeaderItem.Cells[i] 不是页眉吗?Top
4 楼LoveCherry(论成败,人生豪迈;大不了,重头再来!^_^)回复于 2005-11-01 16:50:41 得分 2
<input type="button" onclick="alert(document.all.DataGrid1.rows[0].cells[0].innerText)" value="读取">Top
5 楼stoneallen(我不想说,我很亲切)回复于 2005-11-01 16:59:19 得分 0
当DATAGRID绑定之后,用DataGrid.Columns.Count得到值为0
不会吧,我刚刚测过都不是为0啊,而且可以直接通过DataGrid1.Columns[i].HeaderText来取啊Top
6 楼LoveCherry(论成败,人生豪迈;大不了,重头再来!^_^)回复于 2005-11-01 17:00:50 得分 5
楼上,那是你没有AutoGenerateColumnsTop
7 楼smallMage(小马哥)回复于 2005-11-01 17:05:31 得分 2
支持楼上滴Top
8 楼stoneallen(我不想说,我很亲切)回复于 2005-11-01 17:13:14 得分 0
回复人: LoveCherry(论成败,人生豪迈;大不了,重头再来!^_^) ( ) 信誉:111 2005-11-01 17:00:00 得分: 0
楼上,那是你没有AutoGenerateColumns
AutoGenerateColumns不管为true还是为false,DataGrid.Columns.Count都不为0啊 ,刚刚有测过,你测过为0吗?
Top
9 楼milchcow(MilchCow)回复于 2005-11-01 17:25:10 得分 0
当AutoGenerateColumns为true时,DataGrid.Columns.Count是不包含TABLE中的字段。
比如说,有这样一个DATAGRID
<asp:datagrid id="DataGrid1" runat="server" Width="100%" AllowSorting="True" CellPadding="4"
BackColor="White" BorderWidth="1px" BorderStyle="None" BorderColor="#3366CC" PageSize="40">
<Columns>
<asp:TemplateColumn HeaderText="TMP1">
<ItemTemplate>
<asp:CheckBox id="Chk" runat="server" Width="10"></asp:CheckBox>
</ItemTemplate>
<FooterStyle Width="10px"></FooterStyle>
</asp:TemplateColumn>
</Columns>
</asp:datagrid>
AutoGenerateColumns为true
DATAGRID绑定一个表TABLE1 ,TABLE分别有字段A1,A2,A3,A4,A5
在DATAGRID.DataBind()之后,DataGrid.Columns.Count的值是1而不是6,大家可以试试看.
因此,用string HeaderText = DataGrid.Columns[i].HeaderText;的方法就会出错,超出索引了.
Top
10 楼pontus(pontus)回复于 2005-11-01 17:30:31 得分 0
private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
if(e.Item.ItemType == ListItemType.Header)
{
Response.Write(e.Item.Cells[0].Text);
}
}Top
11 楼stoneallen(我不想说,我很亲切)回复于 2005-11-01 17:31:25 得分 0
哦,明白,那再向你推荐另外一种方法
((TableCell)DataGrid.Controls[0].Controls[0].Controls[i]).Text//可以获得第i列的HeaderTextTop
12 楼LoveCherry(论成败,人生豪迈;大不了,重头再来!^_^)回复于 2005-11-01 17:35:44 得分 50
三级分别是
System.Web.UI.WebControls.ChildTable
System.Web.UI.WebControls.DataGridItem
System.Web.UI.WebControls.TableCellTop
13 楼jxufewbt(我的目标是5星)回复于 2005-11-02 09:59:53 得分 2
for(int i=0;i < DataGrid.Columns.Count-1;i++)
{
string HeaderText = DataGrid.Columns[i].HeaderText;
}
Top
14 楼milchcow(MilchCow)回复于 2005-11-02 10:02:38 得分 0
楼上的这种方法不行的Top
15 楼zhangyu028(听天之音)回复于 2005-11-02 10:23:44 得分 2
milchcow() 说的对,我试了确实是这样AutoGenerateColumns的列都找不到
Top
16 楼stoneallen(我不想说,我很亲切)回复于 2005-11-02 10:28:12 得分 0
((TableCell)DataGrid.Controls[0].Controls[0].Controls[i]).Text//可以获得第i列的HeaderText
试下这方法,我测过AutoGenerateColumns的列可以取到的Top
17 楼milchcow(MilchCow)回复于 2005-11-02 10:35:33 得分 0
((TableCell)DataGrid.Controls[0].Controls[0].Controls[i]).Text//可以获得第i列的HeaderText
试下这方法,我测过AutoGenerateColumns的列可以取到的
=================================================================================
我怎么取不到呢Top
18 楼zhangyu028(听天之音)回复于 2005-11-02 10:45:21 得分 0
((TableCell)DataGrid.Controls[0].Controls[0].Controls[i]).Text//可以获得第i列的HeaderText
我取出来了。可行Top
19 楼foxconn_nich(Blog: http://www.jemy.cn)回复于 2005-11-02 10:48:14 得分 0
private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
if(e.Item.ItemType == ListItemType.Header)
{
for(int i=0;i < e.Item.Cells.Count();i++)
{
Response.Write(e.Item.Cells[i].Text);
}
}
}
Top
20 楼stoneallen(我不想说,我很亲切)回复于 2005-11-02 10:55:01 得分 100
我的很简单的,就一个DataGrid,设置AutoGenerateColumns=true,类似
<asp:DataGrid id="DataGrid1" runat="server" AutoGenerateColumns="True">
<Columns>
<asp:TemplateColumn HeaderText="test">
<ItemTemplate>
<asp:CheckBox id="Chk" runat="server" Width="10"></asp:CheckBox>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>
后台绑定两条记录(不是通过数据库绑定,手工绑定的),有四列,类似
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if(!IsPostBack)
{
GridBind();
}
}
private void GridBind()
{
DataTable dt = new DataTable();
DataColumn dc1 = new DataColumn();
dc1.ColumnName = "a";
dt.Columns.Add(dc1);
DataColumn dc2 = new DataColumn();
dc2.ColumnName = "b";
dt.Columns.Add(dc2);
DataColumn dc3 = new DataColumn();
dc3.ColumnName = "c";
dt.Columns.Add(dc3);
DataColumn dc4 = new DataColumn();
dc4.ColumnName = "d";
dt.Columns.Add(dc4);
DataRow dr;
dr = dt.NewRow();
dr["a"] = "a1";
dr["b"] = "b1";
dr["c"] = "c1";
dr["d"] = "d1";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["a"] = "a2";
dr["b"] = "b2";
dr["c"] = "c2";
dr["d"] = "d2";
dt.Rows.Add(dr);
this.DataGrid1.DataSource = dt;
this.DataGrid1.DataBind();
}
再加一个按钮测试是否可以通过该方法获得各列的HeaderText
private void Button2_Click(object sender, System.EventArgs e)
{
Random a = new Random();
int i = a.Next(5);//因为一共有五列,包括四列是AutoGenerateColumns,所以随机抽取数字0到4
Response.Write("第" + i + "列的值为:" + ((TableCell)DataGrid1.Controls[0].Controls[0].Controls[i]).Text);//测试结果对不对
}
所有随机结果如下:
第0列的值为:test
第1列的值为:a
第2列的值为:b
第3列的值为:c
第4列的值为:d
结果跟我的DataGrid显示的一样
test a b c d -----各列的Header
a1 b1 c1 d1 -----对应的数据
a2 b2 c2 d2 -----对应的数据
你可以参考下跟你的有什么不同吗?我就觉得通过数据库绑定和手工绑定没什么区别Top
21 楼milchcow(MilchCow)回复于 2005-11-02 10:57:51 得分 0
foxconn_nich(—— http://www.joke-online.net ——)
的方法是在DATAGRID.DataBind()的时候取得.HeaderTEXT而不是在Page.IsPostBack之后取得的Top
22 楼stoneallen(我不想说,我很亲切)回复于 2005-11-02 11:04:39 得分 0
我的就是在Page.IsPostBack之后取得的呀Top
23 楼milchcow(MilchCow)回复于 2005-11-02 11:25:46 得分 0
OK,结贴Top
24 楼ye_zi(行到水穷处·坐看云起时)回复于 2005-11-02 11:29:56 得分 0
if (this.drpd1.SelectedIndex==0) return;
ArrayList alist = new ArrayList();
for (int i=0;i<dgList.Columns.Count;i++)
{
string aa = dgList.Columns[i].HeaderText;
if (drpd1.Items.FindByText(aa)!=null)
alist.Add(i);
}
tbx1.Text = tbx1.Text.Replace(","+this.drpd1.SelectedValue,"");
Hashtable ht=new Hashtable();
ht.Add("userid",Session["USER_ID"].ToString());
if(assigncond=="COMMON")
ht.Add("dsid","1");
if(assigncond=="MAN")
ht.Add("dsid","2");
if(tbx1.Text=="")
ht.Add("xslb",tbx1.Text);
else
ht.Add("xslb",tbx1.Text.Substring(1));
DataSet ds=PublicClass.getDs("410",ht);
this.drpd1.Items.RemoveAt(this.drpd1.SelectedIndex);
for (int i=0;i<dgList.Columns.Count;i++)
{
string aa = dgList.Columns[i].HeaderText;
if (drpd1.Items.FindByText(aa)==null)
{
if (alist.IndexOf(i)>=0)
dgList.Columns[i].Visible = true;
}
}
if (this.drpd1.Items.Count==1)
{
this.drpd1.Visible = false;
this.Label2.Visible = false;
}Top
25 楼xiahouwen(武眉博<活靶子.NET>)回复于 2005-11-02 11:32:35 得分 0
http://www.aspxboy.com/284/archive.aspxTop
26 楼smin1994(smin1994)回复于 2005-11-02 12:29:26 得分 0
private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
if(e.Item.ItemType == ListItemType.Header)
{
Response.Write(e.Item.Cells[0].Text);
}
}
Top
27 楼shoutor(www.mouxiao.com)回复于 2005-11-02 12:36:42 得分 2
for(int i=0;i < DataGrid.Columns.Count-1;i++)
{
string HeaderText = DataGrid.Columns[i].HeaderText;
}
Top
28 楼zeusvenus()回复于 2005-11-02 12:42:10 得分 5
用js方法,LoveCherry那个可以。Top
29 楼hchxxzx(NET?摸到一点门槛)回复于 2005-11-02 13:41:25 得分 20
其实,在DATAGRID中,如果熟悉该控件的组成原理,想要求取它的页眉文本并不是难事。
1.在DATAGRID控件下的第一个子控件,实际对应此控件所生成的表,this.myGrid.Controls[0]
2.在生成的子控件表中,每一行都是一个子控件,假设你生成了10行记录,那么,第0个控件即为你的页眉行,第11个控件即为你的页脚本行,总共12个子控件。
页眉行控件
this.myGrid.Controls[0].Controls[0]
页脚行控件
this.myGrid.Controls[0].Controls[this.myGrid.Controls[0].Controls.Count]
3.页眉行里面的各列(TableCell)即为页眉行控件的子控件
TableCell myCell = (TableCell)this.myGrid.Controls[0].Controls[0];
4.如果是自动绑定生成数据,则页眉文本即在上述的TableCell控件里(myCell.Text),如果有加入排序的,那么在TableCell控件内,应还有一个LinkButton控件,求取此控件之后,即可求取它的文本。
LinkButton mybut = (LinkButton)myCell.Controls[0];
5.需要知道某个控件下的子控件数量或控件类型,可分别使用 Controls.Count.ToString()及Controls.GetType().ToString()来获得。
以下分别为求取模板列方式绑定的DATAGRID及以自动绑定方式生成的DATAGRID内,如何求取该控件的页眉文本的代码。
//在使用模板列的情况下求取值
//求取页眉文本
LinkButton mylnkbut = (LinkButton )this.myGrid.Controls[0].Controls[0].Controls[0].Controls[0];
this.Response.Write(mylnkbut.Text);
//在自动绑定列中求取页眉文字
TableCell myCell = (TableCell)this.myGrid.Controls[0].Controls[0].Controls[0];
this.Response.Write(myCell.Text);
Top
30 楼xiaofeixia__9999(光之影)回复于 2005-11-02 14:51:32 得分 1
表个签Top




