将绑定到TextBox的字段动态更改为ASP.Net GridView

时间:2015-03-04 08:45:21

标签: asp.net gridview

我有一个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 = "";

但不允许进行此转换。

提前谢谢。

2 个答案:

答案 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>