紧急呼救:datagrid动态绑定模板列、绑定列后出现的问题,内有详细代码,up有分

火电 2005-01-14 12:44:40
声明一下:datagrid控件在html页面中只有一列
<asp:datagrid id="ExportGrid" style="Z-INDEX: 102" runat="server" Width="100%" GridLines="Vertical"
AutoGenerateColumns="False" PageSize="15">
<AlternatingItemStyle CssClass="gridEvenRow"></AlternatingItemStyle>
<ItemStyle CssClass="gridOddRow"></ItemStyle>
<HeaderStyle CssClass="gridHead" VerticalAlign="Middle"></HeaderStyle>
<Columns>
<asp:TemplateColumn Visible="False" HeaderText="模板列"></asp:TemplateColumn>
</Columns>
<PagerStyle Visible="False"></PagerStyle>
</asp:datagrid>



本人通过如下函数的方法加入了模板列和绑定列

private void AddBoundColumnToGrid(string strHeaderText,bool bWrap,int iHeaderWidth,string strDataField,bool bVisible,int iColumnIndex,DataGrid objGrid)
{
BoundColumn dc = new BoundColumn();
dc.HeaderText = strHeaderText;
dc.HeaderStyle.Wrap = bWrap;
dc.HeaderStyle.Width = Unit.Parse(iHeaderWidth.ToString() + "%");
dc.HeaderStyle.HorizontalAlign = HorizontalAlign.Center;
dc.HeaderStyle.VerticalAlign = VerticalAlign.Middle;
dc.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
dc.ItemStyle.VerticalAlign = VerticalAlign.Middle;
dc.DataField = strDataField;
dc.Visible = bVisible;
dc.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
objGrid.Columns.AddAt(iColumnIndex,dc);
}

private void AddTemplateColumnToGrid(DataGrid objGrid,int iColumnIndex,
string headtype,string headid,string headinfo,
string itemtype,string itemid,string iteminfo)
{
TemplateColumn tc = new TemplateColumn();
tc.HeaderTemplate = new DataGridTemplates.CTemplateColumn(headtype,headid,true,headinfo);
tc.ItemTemplate = new DataGridTemplates.CTemplateColumn(itemtype,itemid,false,iteminfo);
tc.HeaderStyle.Width = Unit.Parse("10%");
tc.HeaderStyle.HorizontalAlign = HorizontalAlign.Center;
tc.HeaderStyle.VerticalAlign = VerticalAlign.Middle;
tc.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
tc.ItemStyle.VerticalAlign = VerticalAlign.Middle;
objGrid.Columns.AddAt(iColumnIndex,tc);

}


其中的 类 DataGridTemplates.CTemplateColumn 就是继承 ITemplate 类的一个接口,控制模板列中增加何种控件

然后绑定数据后这个时候都没有问题,在 ItemDataBound 事件中都可以获取到绑定到列上的值
但是问题出现在点击模板列上的linkbutton(是通过模板列生成的)时候,没有任何事件触发并且
datagrid上绑定的数据不见了,只是做了向服务端提交的功能,我是想通过点击某一列上的linkbutton
然后进入到该按钮的事件中,把每行中的隐藏列中的数据读取出来

注意:我还不想在html页面中把要显示的列都写死,我想所有要显示的列都灵活读取。
谁帮忙解决一下问题,

还有,在 ItemDataBound 事件中我使用
((LinkButton)e.Item.Cells[7].FindControl("btnShowInfo")).Click += new System.EventHandler(this.ShowInfoClick);没有反应进入不到 ShowInfoClick 函数

在ItemCommand 事件中如果写
但是这个时候 Cells[7] 还没有生成,还是取不到

帮忙啊,急用!!!
...全文
245 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
powbcom 2005-01-14
  • 打赏
  • 举报
回复
估计是要在
if(!Page.IsPostBack) 中进行数据绑定!
jackie615 2005-01-14
  • 打赏
  • 举报
回复
up
goody9807 2005-01-14
  • 打赏
  • 举报
回复
如果你需要结合更多的字段在同一个列中显示,模板列是唯一的方法。如果你需要对某个单元格应用一种特殊的格式,你最好就用datagrid的ItemCreated 事件或者ItemDataBound事件。例如,如果你要改变某个单元格的背景色,或者你要根据某种条件来对单元格应用其它的样式表,你可以在ItemCreated的处理事件中,确定正在创建的项(item)是你需要处理的类型(item 或者AlternatingItem类型),然后应用新的或已存在的样式表。在ItemCreated事件触发时,仍不能保证那一项(item)已经绑定了数据。通过ItemCreated事件的参数e的dataitem属性可以得到触发该事件的datagriditem对象。对于datagrid的ItemCreated事件,它的事件参数是DataGridItemEventArgs类型:
void ItemCreated(Object sender, DataGridItemEventArgs e)
e.Item.DataItem的值在项被创建时根据数据源的不同赋予不同值。如果datagrid绑定的是一个datatable,那么DataItem就是一个DataRow对象。正如我刚才所说,虽然大多数情况下数据绑定(data binding)事件在ItemCreated触发时还没有触发。但实际上,数据绑定事件(data binding)通常发生在ItemDataBound事件触发时。这个规则只有一种情况下例外,就是在基于模板的列中。一个模板列不止能绑定数据源中的某个字段;它还能访问整个的数据源。这使我们可以在ItemCreated事件中做一些处理工作,而不必等ItemDataBound事件触发,因为itemdatabound事件在ItemCreated事件之后触发。对于bound、button以及 hyperlink列,你可能需要ItemDataBound事件来获得datagrid将要显示的数据绑定的文字。

模板列的头
既然TemplateColumn类给了HeaderTemplate(FooterTemplate)属性,你就可以定制给定列的头(header)和尾(footer)。说到定制,它在这里是非常重要的一点。因为在普通的数据绑定列中没有header模板和footer模板。HeaderTemplat只能应用在TemplateColumn 类的一个实例中。对于这个实例,如果你想用一个非标准的方法编辑该列的内容(例如说你想添加对内容的验证),你可以用headertemplate,也可以用一个简单的BoundColumn类来呈现。
真的可以改变列的header布局吗?如果你需要根据某个表达式对列进行排序,排序机制是datagrid自动在列的头部插入一个hyperlink控件,当用户单击hyperlink控件时,asp.net会根据hyperlink控件的href属性触发一个回发事件,从而对该列进行排序操作。就算你不需要排序你也可以很自由的更改列的header。如果你需要用ItemCreated事件在header中增加其它的控件及脱离datagrid控件做其它的任何事情。下面请看一个例子:
Figure 3 Adding the Sort Dropdown
public void ItemCreated(Object sender, DataGridItemEventArgs e)
{
ListItemType lit = e.Item.ItemType;
if (lit == ListItemType.Header)
{
// Create and fill a dropdown list control
DropDownList dd = new DropDownList();
dd.ID = "ddSort";
ListItem li1, li2, li3;

// ListItem constructor takes Text and Value for the item
li1 = new ListItem("Title of courtesy", "titleofcourtesy");
dd.Items.Add(li1);

li2 = new ListItem("Last Name", "lastname");
dd.Items.Add(li2);

li3 = new ListItem("First Name", "firstname");
dd.Items.Add(li3);

// Selects the item, if any, that was selected last time
dd.SelectedIndex = Convert.ToInt32(grid.Attributes["FieldIndex"]);

// Add the dropdown list to the header of the 2nd column
TableCell cell = (TableCell) e.Item.Controls[1];
cell.Controls.Add(dd);
}
}

public void SortCommand(Object sender, DataGridSortCommandEventArgs e)
{
// Code that retrieves the grid's data source GOES HERE
•••

// Sort by the specified expression or figure it out
if (e.SortExpression != "*")
dv.Sort = e.SortExpression;
else
{
// Retrieves the dropdown list control through its ID
DataGridItem dgi = (DataGridItem) e.CommandSource;
DropDownList dd = (DropDownList) dgi.FindControl("ddSort");

// Retrieves the sorting expression from the list
dv.Sort = dd.SelectedItem.Value;

// Persists the currently selected dropdown item
grid.Attributes["FieldIndex"] = dd.SelectedIndex.ToString();
}

// Refreshes the grid
grid.DataBind();
}
goody9807 2005-01-14
  • 打赏
  • 举报
回复
DataGrid的模板列
基于模板的列在datagrid控件中扮演了一个很重要的角色,它们允许你增加任意一种类型的列到datagrid,datagrid通过纯文本的形式或者某种预定义的列类型显示内容。然而,有时预定义的列类型并不能实现我们想要的东西。模板列有四种不同的模板,如图1
Figure 1 DataGrid Column Templates
Name Description
ItemTemplate Contains the template for the items in a DataGrid's column.
<ItemTemplate>
<asp:label runat="server" text= '<%# ... %>'...>
</ItemTemplate>
You can use any combination of HTML text and ASP.NET controls to populate the column.
EditItemTemplate Controls the contents of the item selected for editing in the column of the DataGrid control. Place the controls you need for editing the cell between the opening and closing EditItemTemplate tags.
<EditItemTemplate>
<asp:textbox runat="server" text= '<%# ... %>'...>
</EditItemTemplate>
HeaderTemplate Contains the template for the heading section.
<HeaderTemplate>
<asp:label runat="server" text= "Header"...>
</HeaderTemplate>
If you omit this template, the column header is rendered with a label or a hyperlink if sorting is enabled. By specifying a custom template, you make yourself responsible to provide the user interface needed to enable sorting on the column.
FooterTemplate Contains the template for the footer section of the column. The default value is a null reference.
<FooterTemplate>
<asp:label runat="server" text= "..."...>
</FooterTemplate>
The footer is displayed only if the ShowFooter property of the DataGrid is set to True.

你可能会频繁的使用模板列(ItemTemplate)。它定义了怎么样显示列中的单元格及由哪些元素组成控件的内容。HeaderTemplate 和 FooterTemplate我们就不说了,相信大家都知道是干什么用的。当列的所属行进入编辑模式时,EditItemTemplate属性指明单元格应该怎样变化。但要注意的是,它和datalist控件不一样,datagrid没有选中模板。
当你需要用不规范的方式显示整个列的时候,你的DataGrid应该用基于模板的列。如果你需要显示数据的数据无法用datagrid 提供的普通的模板显示时,这时,模板就是你的最佳选择了。

下面的代码演示了怎样绑定数据到datagrid控件的模板列。
<asp:TemplateColumn runat="server"
HeaderText="heading">
<itemtemplate>
...ASP.NET layout goes here...
</itemtemplate>
</asp:TemplateColumn>
注意模板列和其它类型的列一样,也有一个可用于排序的标题文字。模板列没有直接用于绑定数据源字段的属性。也就是在TemplateColumn类的成员里面,你找不到任何DataField或DataTextField属性。
缺少直接绑定数据源字段的属性是为了更灵活的处理列的显示布局。要呈现一个列,你可以用label控件的text属性,当然也可以用dropdownlist控件或者image控件,这两个控件都没有类似text的属性。结果一样,你都必须用一个数据绑定表达式来绑定数据。在我看来,虽然要写冗长的数据绑定表达式,但它却给了你极大的灵活性。
下面的代码片断演示怎样正确绑定内容到item template:
<asp:label runat="server"
Text='<%# DataBinder.Eval(Container.DataItem,
"lastname") %>'
/>
通过用DataBinder.Eval方法,你能够访问当前数据源的任何一个字段。除此以外,你还可以结合任何的排序表达式来对字段进行排序。这是用其它简单的模板列无法实现的。


Figure 2 Column

在图2中,你能看到一个基于模板列实现的例子,它演示了怎样在一列中显示数据源中两个字段。在不是基于模板的列中只能获得(显示)一个字段。这个模板的代码如下所示:
<itemtemplate>
<%#
"<b>" +
DataBinder.Eval(Container.DataItem, "lastname") +
"</b>, " +
DataBinder.Eval(Container.DataItem, "firstname")
%>
</itemtemplate>
brightheroes 2005-01-14
  • 打赏
  • 举报
回复
看你的问题,好像是点击按钮之后,动态生成的模板列啊绑定列啊什么的丢失了

你需要在Page_Load里面

放开那个if(!Page.IsPostBack)限制条件,否则肯定是Grid只有1列了
cuizhq0227 2005-01-14
  • 打赏
  • 举报
回复
做个记号
tengjian1981 2005-01-14
  • 打赏
  • 举报
回复
up
amendajing 2005-01-14
  • 打赏
  • 举报
回复
up
火电 2005-01-14
  • 打赏
  • 举报
回复
多谢 brightheroes(闭关|那一剑的风情) 地提醒

果然阿

我都老糊涂了

还有多谢 goody9807() 的热心

还有其他人

我再看看有没有问题

然后结铁
brightheroes 2005-01-14
  • 打赏
  • 举报
回复
什么意思?
datagrid 就取不到了
取不到什么了?
火电 2005-01-14
  • 打赏
  • 举报
回复
if(!Page.IsPostBack)

这个我去掉了还是不行啊

点击那个模板列中的按钮时 datagrid 就取不到了

62,047

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧