我有一个gridview,我用List<>填充。 GridView的列是TextBoxes(作为TemplateField)。 该列表可能包含来自2个不同自定义类的对象,其显示的字段不完全相同。
对于class1,我需要在GridView中显示:
class1.Name
class1.field1
对于class2,我需要在GridView中显示:
class2.Name
class2.field2
所以我可以将gridview设置到aspx中,以便显示class1项:
<asp:GridView ID="DG_Table" runat="server" style="z-index: 1;
autogeneratecolumns="False"
onrowcommand="DG_Table_RowCommand"
<Columns>
<asp:TemplateField HeaderText="Name" >
<ItemTemplate>
<asp:TextBox ID="Name" runat="server" Text='<%# Bind("Name") %>'></asp:TextBox>
</ItemTemplate>
<asp:TemplateField HeaderText="field1" >
<ItemTemplate>
<asp:TextBox ID="field1" runat="server" Text='<%# Bind("field1") %>'></asp:TextBox>
</ItemTemplate>
</Columns>
</asp:GridView>
在DataGrid中显示List<Class1>
可以正常工作。
现在,如果我想将class2的项目显示到datagrid中,我将执行以下操作:
DG_Table.DataSource = new List<Class2>;
DG_Table.DataBind();
这显然会导致这种错误: System.Web.dll中出现“System.Web.HttpException”类型的异常,但未在用户代码中处理
其他信息:DataBinding:'Class2'不包含名为'Field1'的属性。
所以我想,在绑定到List之前,我需要将我的第二列转换为后面的代码。
等同于什么Text='<%# Bind("field1") %>'
进入后面的代码?
我期待这样的事情:
((TextBox)DG_Table.Columns[2]).Text = "";
但不允许进行此转换。
提前谢谢。答案 0 :(得分:1)
您可以尝试使用anonymous
类型在数据绑定之前绑定数据,然后将数据转换为anonymous
类型,然后绑定它们。
将您的网格视图更改为,
<asp:GridView ID="DG_Table" runat="server" style="z-index: 1;autogeneratecolumns="False" onrowcommand="DG_Table_RowCommand">
<Columns>
<asp:TemplateField HeaderText="Name" >
<ItemTemplate>
<asp:TextBox ID="Name" runat="server" Text='<%# Eval("Name") %>'></asp:TextBox>
</ItemTemplate>
<asp:TemplateField HeaderText="field1" >
<ItemTemplate>
<asp:TextBox ID="field1" runat="server" Text='<%# Eval("FieldValue") %>'></asp:TextBox>
</ItemTemplate>
</Columns>
</asp:GridView>
为了绑定你的第一堂课,
gridView1.DataSource = class1List.Select(x=> new{Name = x.Name,FieldValue = x.Field1});
gridview1.DataBind();
绑定第二个班级列表时
gridView1.DataSource = class2List.Select(x=> new{Name = x.Name,FieldValue = x.Field1});
gridview1.DataBind();
答案 1 :(得分:0)
你的问题出现在第二个TextBox中,它是Binds还是Evals&#34; field1&#34;这不是Class2中的属性。
你可以像代码答案的@code中提到的那样做,或者只是更改View的模型类来绑定它
Class GvItemModel
{
public string Name {get; set;}
public string Field{get; set;}
}
过去它总是作为dataSource
var dataSource = new List<CvItemModel>();
... //Load class1 or Class2 it depends on your choice
然后
DG_Table.DataSource = dataSource ;
DG_Table.DataBind();
更改第二个TextBox数据源。
<asp:TemplateField HeaderText="field1" >
<ItemTemplate>
<asp:TextBox ID="field1" runat="server" Text='<%# Bind("Field") %>'></asp:TextBox>
</ItemTemplate>