1

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

目前,我可以轻松地将整个内容显示在网格视图中。我什至创建了一个自定义 DataTable 用作数据源,并且工作正常。但是我仍然不知道如何添加编辑功能。我发现的教程要么用于 DataSource 控件,要么涉及制作扩展 GridView 的自定义类等等。我在 aspx 页面中添加了一个 CommandField,它可以正常工作,但 DataTable 中的 ReadOnly 列仍然是可编辑的。

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

我在下面包含了一些伪代码,它们创建了 2 个 GridView。一个只是显示所有信息,但不可编辑。另一个使用显示 ColA 的 DataTable、带有空行的 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();

在aspx页面中制作GridView控件

<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>
4

1 回答 1

1

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

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

    protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
    {
        GridView1.EditIndex = e.NewEditIndex;
    }

    protected void GridView1_RowUpdated(object sender, GridViewUpdatedEventArgs e)
    {
        // handle row updated
    }

    protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
    {
        GridView1.EditIndex = -1;
    }

    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        // handle row command
    }
于 2011-04-03T21:26:09.483 回答