问题描述
本人想在后台动态的编写GridView的代码:publicvoidSetGridView(GridViewgvSearch){gvSearch.Columns.Clear();gvSearch.Columns.Add(newBoundField(){HeaderText="学号",DataField="No",ReadOnly=true});gvSearch.Columns.Add(newBoundField(){HeaderText="姓名",DataField="Name"});PanelpItemSex=newPanel();Labell=newLabel();l.Text=Convert.ToBoolean(DataBinder.Eval(this,"Sex"))?"男":"女";此句报错,显示没有Sex值,Sex值本应该是数据绑定时类的属性pItemSex.Controls.Add(l);DropDownListddlSex=newDropDownList();ddlSex.Items.Add(newListItem(){Value="male",Text="男"});ddlSex.Items.Add(newListItem(){Value="female",Text="女"});PanelpEdirSex=newPanel();pEdirSex.Controls.Add(ddlSex);gvSearch.Columns.Add(newTemplateField(){ItemTemplate=pItemSexasITemplate,EditItemTemplate=pEdirSexasITemplate});}想问一下诸位大神们,怎么实现类似这样前台代码的功能:<asp:GridViewrunat="server"CssClass="infoBackground"DataKeyNames="No"ID="gvSearch"AutoGenerateColumns="False"OnRowEditing="gvSearch_RowEditing"OnRowCancelingEdit="gvSearch_RowCancelingEdit"><Columns><asp:BoundFieldHeaderText="学号"DataField="No"ReadOnly="true"/><asp:BoundFieldHeaderText="姓名"DataField="Name"/><asp:TemplateFieldHeaderText="性别"><ItemTemplate><asp:Labelrunat="server"ID="txtSex"Text='<%#Convert.ToBoolean(Eval("Sex"))?"男":"女"%>'></asp:Label></ItemTemplate><EditItemTemplate><asp:DropDownListrunat="server"ID="ddlSex"><asp:ListItem>男</asp:ListItem><asp:ListItem>女</asp:ListItem></asp:DropDownList></EditItemTemplate></asp:TemplateField><asp:CommandFieldHeaderText="编辑"ShowEditButton="true"/></Columns></asp:GridView>即依旧是数据绑定,只不过在页面加载时GridView无任何内容,所有的Column(学号,姓名列已实现,只是带Eval()不知如何实现)都是在后台加进去。谢谢大神
解决方案
解决方案二:
你在SetGridView中调用DataBinder,此DataBinder它是什么?怎么可能有值?
解决方案三:
DataBinder只在控件绑定每一行(item)时有值。我想,如果是asp.net的设计者看到你这样使用DataBinder,一定会“后悔死”当初那样草率地弄了一个雷人的全局DataBinder概念出来。胡乱设计一个扩大了作用域访问范围的变量,我们都知道其实这是有害的。DatBinder就这样被你滥用了。虽然它在运行时报错了,但是还是应该“后悔死”的。根本不应该给你提供什么DataBinder。你这里完全是滥用的。如果你要根据数据来判断是否显示某些“列”,你可以在给控件实际绑定数据之前先去数据库里读取一条记录,然后判断你的列是否显示。这跟后续的读取所有待处理的真实数据,无关。
解决方案四:
不是这样访问的吧
解决方案五:
通过rowdatabind行绑定事件去做可能会比较方便
解决方案六:
引用2楼以专业开发人员为伍的回复:
DataBinder只在控件绑定每一行(item)时有值。我想,如果是asp.net的设计者看到你这样使用DataBinder,一定会“后悔死”当初那样草率地弄了一个雷人的全局DataBinder概念出来。胡乱设计一个扩大了作用域访问范围的变量,我们都知道其实这是有害的。DatBinder就这样被你滥用了。虽然它在运行时报错了,但是还是应该“后悔死”的。根本不应该给你提供什么DataBinder。你这里完全是滥用的。如果你要根据数据来判断是否显示某些“列”,你可以在给控件实际绑定数据之前先去数据库里读取一条记录,然后判断你的列是否显示。这跟后续的读取所有待处理的真实数据,无关。
我知道,这段代码是错的,想问一下我怎么才能实现我描述的功能