aspnet和C#:如何将TemplateField链接到动态创建的匿名类型?

aspnet和C#:如何将TemplateField链接到动态创建的匿名类型?,c#,asp.net,gridview,boundfield,commandfield,C#,Asp.net,Gridview,Boundfield,Commandfield,我有一个Linq查询,返回一个匿名类型,然后将其用作GridView的数据源。其中只有一列需要编辑。我只想能够点击编辑按钮,让这1列的所有行都变成文本框(理想情况下)。我会满足于每行都有一个CommandField。问题是,如果不创建自定义类或手动处理所有字段,我不知道如何做到这一点。此列还必须以特定方式更新数据库中的值(因此我需要为该查询编写自定义代码) 目前,我可以轻松地在网格视图中显示整个内容。我甚至创建了一个自定义的DataTable用作数据源,这样就可以了。但是我仍然不知道如何添加编辑

我有一个Linq查询,返回一个匿名类型,然后将其用作GridView的数据源。其中只有一列需要编辑。我只想能够点击编辑按钮,让这1列的所有行都变成文本框(理想情况下)。我会满足于每行都有一个CommandField。问题是,如果不创建自定义类或手动处理所有字段,我不知道如何做到这一点。此列还必须以特定方式更新数据库中的值(因此我需要为该查询编写自定义代码)

目前,我可以轻松地在网格视图中显示整个内容。我甚至创建了一个自定义的DataTable用作数据源,这样就可以了。但是我仍然不知道如何添加编辑功能。我找到的教程要么是针对数据源控件的,要么涉及创建扩展GridView的自定义类,等等。我在aspx页面中添加了一个CommandField,它可以正常工作,但是DataTable中的只读列仍然是可编辑的

我希望有一个简单的解决方案……例如,在.aspx页面中创建一个TemplateField,我可以提供一个Item和EditItem模板,并以某种方式绑定到Linq查询返回的字段。

我在下面包含了一些创建2个GridView的伪代码。一个只显示所有信息,但不可编辑。另一个使用DataTable,其中显示ColA、来自aspx页面的空行ColB和来自代码隐藏页面的ColB,并填充

将查询绑定到GridView:

var qry = from t in database
          ...
          select new { colA, colB };

GridView2.DataSource = qry; // not shown in pseudocode
GridView2.DataBind();
制作数据表

    const string ColA = "ColA";
    const string ColB = "ColB";

    DataTable dt = new DataTable();
    DataColumn dc = new DataColumn(ColA, typeof(System.String));
    dt.Columns.Add(dc);

    dc = new DataColumn(ColB, typeof(System.String));
    dt.Columns.Add(dc);

    foreach (var item in qry) {
        DataRow dr = dt.NewRow();
        dr[ColA] = item.ColA;
        dt.Rows.Add(dr);
    }

    foreach (DataColumn col in dt.Columns) {
        col.ReadOnly = false;
        BoundField bf = new BoundField();
        bf.DataField = col.ColumnName;
        bf.HeaderText = col.ColumnName;
        GridView1.Columns.Add(bf);
    }

    GridView1.DataSource = dt;
    GridView1.DataBind();
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" >
  <Columns>
     <asp:TemplateField HeaderText="ColB">
       <EditItemTemplate>
          <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
       </EditItemTemplate>
       <ItemTemplate>
          <asp:Label ID="Label1" runat="server" ></asp:Label>
       </ItemTemplate>
     </asp:TemplateField>
     <asp:CommandField ButtonType="Button" ShowDeleteButton="True" 
        ShowEditButton="True" ShowInsertButton="True" UpdateText="Save">
     </asp:CommandField>
   </Columns>
</asp:GridView>
在aspx页面中创建GridView控件

    const string ColA = "ColA";
    const string ColB = "ColB";

    DataTable dt = new DataTable();
    DataColumn dc = new DataColumn(ColA, typeof(System.String));
    dt.Columns.Add(dc);

    dc = new DataColumn(ColB, typeof(System.String));
    dt.Columns.Add(dc);

    foreach (var item in qry) {
        DataRow dr = dt.NewRow();
        dr[ColA] = item.ColA;
        dt.Rows.Add(dr);
    }

    foreach (DataColumn col in dt.Columns) {
        col.ReadOnly = false;
        BoundField bf = new BoundField();
        bf.DataField = col.ColumnName;
        bf.HeaderText = col.ColumnName;
        GridView1.Columns.Add(bf);
    }

    GridView1.DataSource = dt;
    GridView1.DataBind();
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" >
  <Columns>
     <asp:TemplateField HeaderText="ColB">
       <EditItemTemplate>
          <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
       </EditItemTemplate>
       <ItemTemplate>
          <asp:Label ID="Label1" runat="server" ></asp:Label>
       </ItemTemplate>
     </asp:TemplateField>
     <asp:CommandField ButtonType="Button" ShowDeleteButton="True" 
        ShowEditButton="True" ShowInsertButton="True" UpdateText="Save">
     </asp:CommandField>
   </Columns>
</asp:GridView>

为了避免错误,您必须处理所有行事件;像这样的

    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" OnRowCancelingEdit="GridView1_RowCancelingEdit"
        OnRowCommand="GridView1_RowCommand" OnRowEditing="GridView1_RowEditing" OnRowUpdated="GridView1_RowUpdated">
        <Columns>
            <asp:BoundField DataField="ColA" ReadOnly="true" />
            <asp:TemplateField HeaderText="ColB">
                <EditItemTemplate>
                    <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("ColB") %>'></asp:TextBox>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%# Bind("ColB") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:CommandField ButtonType="Button" ShowDeleteButton="True" ShowEditButton="True"
                ShowInsertButton="True" UpdateText="Save"></asp:CommandField>
        </Columns>
    </asp:GridView>

为了避免错误,您必须处理所有行事件;像这样的

    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" OnRowCancelingEdit="GridView1_RowCancelingEdit"
        OnRowCommand="GridView1_RowCommand" OnRowEditing="GridView1_RowEditing" OnRowUpdated="GridView1_RowUpdated">
        <Columns>
            <asp:BoundField DataField="ColA" ReadOnly="true" />
            <asp:TemplateField HeaderText="ColB">
                <EditItemTemplate>
                    <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("ColB") %>'></asp:TextBox>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%# Bind("ColB") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:CommandField ButtonType="Button" ShowDeleteButton="True" ShowEditButton="True"
                ShowInsertButton="True" UpdateText="Save"></asp:CommandField>
        </Columns>
    </asp:GridView>

您正在使用ASP.NET 4吗?它有更好的控制Id的选项您是否使用ASP.NET 4?它有更好的控制Id的选项。非常感谢!我几乎得到了我想要的,但出于某种原因…专栏出现了两次。我从TemplateField中得到一个,从code behind中得到一个,没有空的头。当我试图删除代码隐藏中的部分代码时(例如DataTable或duplicate列,我会收到错误或GridView不会出现)。你能不能把你的代码贴在后面或者解释一下我遗漏了什么?非常感谢你的帮助!!:)没有关系!经过许多挫折之后,我终于明白了。这是我开始感冒的原因。再次非常感谢你!你让我的生活更轻松了@Lindezeh Lou列的重复通常源于未设置
AutoGenerateColumns=“False”
,但您的GridView1标记中似乎有这样的设置。你能确定吗?另外,对于只读列,您可以在标记中执行
。哇,非常感谢!我几乎得到了我想要的,但出于某种原因…专栏出现了两次。我从TemplateField中得到一个,从code behind中得到一个,没有空的头。当我试图删除代码隐藏中的部分代码时(例如DataTable或duplicate列,我会收到错误或GridView不会出现)。你能不能把你的代码贴在后面或者解释一下我遗漏了什么?非常感谢你的帮助!!:)没有关系!经过许多挫折之后,我终于明白了。这是我开始感冒的原因。再次非常感谢你!你让我的生活更轻松了@Lindezeh Lou列的重复通常源于未设置
AutoGenerateColumns=“False”
,但您的GridView1标记中似乎有这样的设置。你能确定吗?此外,对于只读列,可以在标记中执行