【问题标题】:Change dynamically the field bound to a TextBox into an ASP.Net GridView将绑定到 TextBox 的字段动态更改为 ASP.Net GridView
【发布时间】:2015-03-04 08:45:21
【问题描述】:

我有一个使用 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&lt;Class1&gt; 可以正常工作。 现在,如果我想将 class2 的项目显示到数据网格中,我将执行以下操作:

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 = "";

但是这种转换是不允许的。

提前致谢。

【问题讨论】:

    标签: asp.net gridview


    【解决方案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();
    

    【讨论】:

    • 这就像一个魅力。非常感谢您的快速帮助:-)。
    【解决方案2】:

    您的问题出在它绑定或评估的第二个文本框“field1”中,它不是 Class2 中的属性。

    您可以按照代码答案的@code 中提到的方式执行操作,或者只是更改为视图创建模型类以绑定它

    Class GvItemModel 
    {
       public string Name {get; set;}
       public string Field{get; set;}
    }
    

    并且总是作为数据源过去

    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>
    

    【讨论】:

    • 他知道他在寻求解决方案。与其说是回答,不如说是评论。
    • @CoderofCode 现在可以了吗? :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    相关资源
    最近更新 更多