5

如何添加编辑框,并在提交期间读取它们的值asp:Repeater


我有一个asp:GridView显示只读(即不可编辑)数据集,例如:

在此处输入图像描述

我怎样才能使单元格GridView可编辑,例如(Photoshop Mockup):

在此处输入图像描述

注意:我没有在 Photoshop 中为每一行和每一列模拟一个编辑框(因为它花费了太长时间)。你还是明白的。

  • 我如何说服一个asp:GridView在每个单元格中显示一个编辑框?
  • 如果我确实说服asp:GridView显示一个编辑框,我如何“阅读”它们OnClick保存按钮?

奖金喋喋不休

我不会反对使用asp:Repeater手动放置<INPUT>控件。然后我的困惑是如何在OnClick保存”按钮期间读取每个输入。尽管我很乐意使用中继器,而 GridView 可能无法完成我想要使中继器成为唯一可能性的事情,但这个问题是关于 GridView 的。

  • 如果 GridView可以做到:太好了;如何?
  • 如果 GridView不能这样做:这也是一个答案。
4

2 回答 2

9

您是否尝试过设置 的EditIndex属性DataGrid

例子:

<asp:GridView runat="server" onrowediting="grdProducts_RowEditing" 
    ID="grdProducts">
    <Columns>
        <asp:CommandField ShowEditButton="True" />
    </Columns>
</asp:GridView>

背后的代码

    protected void grdProducts_RowEditing(object sender, GridViewEditEventArgs e)
    {
        this.grdProducts.EditIndex = e.NewEditIndex;
        This.BindGrid();
    }

请注意,您必须重新绑定网格

通常您保存每行的数据,这意味着您在每一行中都有一个编辑链接,在您进入编辑模式后,会出现一个保存按钮和一个可选的取消按钮,这将允许您保存该特定行的值

使用以下方法时,遵循这种方法是微不足道的GridView

    protected void grdProducts_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        // old values for the current row
        var oldValues = e.OldValues;

        // new (updated) values for the current row
        var newvalues = e.NewValues;

        // Exit edit mode
        this.grdProducts.EditIndex = -1;

        // Update the grid
        this.BindGrid();
    }

在网格标记中只需添加以下内容:

    onrowupdating="grdProducts_RowUpdating"

如果您需要在编辑或以只读模式显示单元格数据时指定自定义控件,请使用网格模板:

       <Columns>
        <asp:TemplateField HeaderText="Name">
            <EditItemTemplate>
                <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Name") %>'></asp:TextBox>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Label ID="Label1" runat="server" Text='<%# Bind("Name") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
      </Columns>
于 2012-06-18T18:39:06.220 回答
4

您可以使用 GridView 执行此操作,但如果您有很多列,您将生成大量代码。

首先制作 GridView TemplateFields 中的所有列。在我的示例中,我将只使用一列。像这样:

<asp:GridView ID="test" runat="server" AutoGenerateColumns="false">
    <Columns>
        <asp:TemplateField HeaderText="Foo" SortExpression="foo">
            <ItemTemplate>
                <asp:TextBox ID="FooText" runat="server" Text='<%# Eval("Foo") %>'></asp:TextBox>
            </ItemTemplate>
        </asp:TemplateField>
        <!-- other cols here -->
    </Columns>
</asp:GridView>
<asp:Button ID="Save" runat="server" Text="Save" OnClick="Save_Click" />

然后在保存按钮后面的代码中,您可以遍历 GridView 中的行:

foreach (GridViewRow gvRow in test.Rows)
{
    string val = ((TextBox)gvRow.FindControl("FooText")).Text;
    <!-- other cols here -->
    //do something with all the values you have parsed from the row
}
于 2012-06-26T15:07:32.163 回答