如题
在gridview里面需要通过标识显示名称 代码如下:
<asp:TemplateField HeaderStyle-Width="60px" HeaderText="关联课程">
<ItemTemplate>
<%# GetCourse(Eval("CourseId"))%>
</ItemTemplate>
</asp:TemplateField>
但是由于我同时需要将显示同样的上下行合并
我调用的时候一个通用的合并相同的行的公用方法
它里面是通过cells来取值判断,然后合并行
gvr.Cells[cellNum].Text
这样算是标准的获取gridview某行某列值的做法
但是如果我用这种方式绑定
<ItemTemplate>
<%# GetCourse(Eval("CourseId"问题补充: 好像cnblog出bug了 后面的东西发不上去 下面为发不上去的部分 但是如果我用这种方式绑定 <ItemTemplate> <%# GetCourse(Eval("CourseId"))%> </ItemTemplate> 那么cell取出的值就是空 不知道各位在遇到这种情况的时候怎么处理的 原则上是不希望修改合并行的函数的因为那个算是个通用函数
模板列的.Text一定是空的,像这样的情况会生成一个一般会生成一个Literal控件。
用gvr.Cells[cellNum].Controls[0]可以得到这个Literal控件。
<ItemTemplate>
<asp:TextBox ID="txtTempT" runat="server"/>
</ItemTemplate>
上面这个.Controls[0]也是一个Literal控件。因为如果ItemTemplate里的控件没有紧跟着<ItemTemplate>后写(有空格或空行)也会在这个控件之前生成一个Literal控件。所以第二个.Controls[0]并不是txtTempT而是一个Literal。如果要让txtTempT通过.Controls[0]找到就必须像下面这样写:(前面不能有任何空)
<ItemTemplate><asp:TextBox ID="txtTempT" runat="server"/>
</ItemTemplate>
你这个问题应该就是这个TemplateField问题引起的,设几个断点看看TemplateField里的Controls里都有些什么你就了解了。
另外:如果还取不到值可以先通过客户端的javascript将这行的内容保存到几个hiddenField里。服务器端从hiddenField里取值。
方法是多样的~呵呵
在ItemTemplate中天就爱一个Lable控件:
<ItemTemplate><asp:Label ID="lblID" runat="server"/>
</ItemTemplate>
就可以使用下面的代码:
if (e.Item.ItemType == ListItemType.Item)
{
Label lblID = (Label)e.Item.FindControl("lblID");
}
<ItemTemplate>
<%# GetCourse(Eval("CourseId"))%>
</ItemTemplate>
那么cell取出的值就是空
:你在RowDataBound中 用 下面的语句试试:
DataBoundLiteralControl c = item.Controls[0] as DataBoundLiteralControl;
string s = c.Text;
:你在RowCreate中 用 下面的语句试试:
DataRowView row = (DataRowView)e.Item.DataItem;// 不一定是DataRowView也可能是业务对象
string s = c.Text;