【问题标题】:asp.net gridview edit mode indexasp.net gridview 编辑模式索引
【发布时间】:2013-12-10 13:44:50
【问题描述】:

我有一个 gridview,它通过 sql 数据源使用 SELECT 命令填充:Select * FROM myTable

当页面首次加载时显示表中的每条记录。

gridview 的每一行都有一个编辑按钮,当用户单击该行时,我想更新 gridview 以仅在 gridview 中显示该结果,因此我将 sql 数据源的 SELECT 命令更改为SELECT * FROM myTable WHERE ID = currentEditRow

除了一个问题外,当编辑除第一行之外的任何其他行时,更新和取消按钮不会显示在该行上。好像不在编辑模式。

知道为什么会这样吗?

代码:

 protected void gvResults_RowEditing(object sender, GridViewEditEventArgs e)
        {
            gvResults.EditIndex = e.NewEditIndex;
            SqlDataSource1.SelectCommand = "SELECT * FROM [myTable] WHERE ID = '" + ID + "'";
        }

【问题讨论】:

  • 必须出示问题相关代码
  • 已添加,但并不比我提到的更多。我相信这与回发有关,并且在gridview只显示一条记录后,它仍然具有gridview有多行时的EditIndex值。
  • 基本上gridview只显示一条记录后editIdex总是为0(因为只有一行返回)
  • @sd_dracula 我认为您可以在右键单击数据源后编写代码。为后面的代码编写额外的代码可能会导致错误。
  • 你能再解释一下吗

标签: c# asp.net gridview


【解决方案1】:

当您将新命令设置为SqlDataSource1.SelectCommand 时,GridView 将再次自动绑定数据。这使它返回到启动模式(在 GridView 中使用编辑按钮显示只读数据)。

否则,你把它当作我下面的示例代码来欺骗它......

这是我与 SqlDataSource1 的 GridView 绑定数据,具有 DataKey 名称“代码”。要实现三个事件处理:OnRowEditing、OnSelectedIndexChanged 和 OnRowCancelingEdit。

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1" 
    DataKeyNames="code" 
    OnRowEditing="GridView1_RowEditing" 
    OnSelectedIndexChanged="GridView1_SelectedIndexChanged" 
    OnRowCancelingEdit="GridView1_RowCancelingEdit">
    <Columns>
        <asp:BoundField DataField="std_room_id" HeaderText="Room ID" SortExpression="std_room_id" />
        <asp:BoundField DataField="booking_name" HeaderText="Name" SortExpression="booking_name" />
        <asp:BoundField DataField="course_id" HeaderText="Course" SortExpression="course_id" />
        <asp:BoundField DataField="course_period" HeaderText="Period" SortExpression="course_period" />
        <asp:BoundField DataField="start_date" HeaderText="Start Date" SortExpression="start_date" />
        <asp:BoundField DataField="end_date" HeaderText="End Date" SortExpression="end_date" />
        <asp:CheckBoxField DataField="approved" HeaderText="Approved" SortExpression="approved" />
        <asp:CommandField ShowSelectButton="true" SelectText="Edit"/>
        <asp:CommandField ShowEditButton="true" Visible="false"/>
    </Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ ConnectionStrings:MyConnectionString %>" 
    SelectCommand="SELECT * FROM [BookingRoom]"></asp:SqlDataSource>
    </div>

我有两个 CommandField:当用户想要打开编辑模式时单击 SelectButton,第二个 CommandField 用于显示更新和取消按钮。

这是我的隐藏代码

protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
    GridView1.Columns[7].Visible = false;
}

protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
    string code = GridView1.DataKeys[GridView1.SelectedIndex].Value.ToString();
    SqlDataSource1.SelectCommand = "SELECT * FROM [BookingRoom] WHERE code = '" + code + "'";

    GridView1.Columns[8].Visible = true;
    GridView1.SetEditRow(0);
}

protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
    GridView1.Columns[7].Visible = true;
    GridView1.Columns[8].Visible = false;
}

我通过在 GridView 中显示 SelectButton(将文本显示为“编辑”)来欺骗它,所有加载的数据都处于启动模式。当用户通过单击 SelectButton 选择行时,它将开始执行 GridView1_SelectedIndexChanged 中的步骤,尝试仅在 GridView 中显示所选行并将编辑模式设置为该行并显示第二个 CommandField (更新和取消按钮)。

要通过这一行GridView1.SetEditRow(0); 设置编辑模式,它将执行 GridView1_RowEditing 中的步骤,尝试隐藏 SelectButton。

最后,您必须像在 GridView1_RowCancelingEdit 中那样处理取消编辑模式,它会尝试显示 SelectButton,并隐藏 Update 和 Cancel 按钮。

我根据我在 GridView 中的列通过列索引访问这两个 CommandField:选择按钮的列索引为 7,更新和取消按钮的列索引为 8

【讨论】:

  • 好的,我知道您正在尝试做什么,这听起来是个好主意。但是,每当我在不是第一个(索引 0)的行上点击 Select 时,它总是从第 0 行中选择数据。
  • 您必须检查您传递给查询的 ID 是否正确。在这一行 SqlDataSource1.SelectCommand = "SELECT * FROM [myTable] WHERE ID = '" + ID + "'"; 设置断点并检查 ID 值。
  • 在您的 gvResults_SelectedIndexChanged 方法中,您应该从 gvResults.SelectedIndex 获取正确的选定行索引,如果您像我一样在 GridView 中设置 DataKeyNames="ID",那么您还应该得到此代码 string ID = gvResults.DataKeys[gvResults.SelectedIndex].Value.ToString(); 的正确 ID(在 gvResults_SelectedIndexChanged 方法中实现)
  • 好的,所以 ID 恢复得很好,我已经用断点检查了它,但似乎问题出在 SelectedIndexChanged 中的这一行:gvResults.SetEditRow(0);。如果我将其注释掉,则选择了正确的 ID,如果我将其保留,则它始终会选择并将完整网格视图中的第一行置于编辑模式。
  • 奇怪,这不会发生在我身上,在将新命令设置为 SqlDataSource1.SelectCommand 之后,您应该在 GridView 中只有选定的行,然后是 GridView1.SetEditRow (0) 不应对查询的数据产生任何影响。能否请您提供您现在拥有的完整代码?
【解决方案2】:

尝试互换两行代码:

protected void gvResults_RowEditing(object sender, GridViewEditEventArgs e)
{
     SqlDataSource1.SelectCommand = "SELECT * FROM [myTable] WHERE ID = '" + ID + "'";
     gvResults.EditIndex = e.NewEditIndex;   
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多