asp.net gridview编辑模式索引

时间:2013-12-10 13:44:50

标签: c# asp.net gridview

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

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

gridview的每一行都有一个Edit按钮,当用户点击我要更新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 + "'";
        }

2 个答案:

答案 0 :(得分:1)

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

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

这是我的GridView绑定数据与SqlDataSource1,DataKey名称为“code”。要实现三种事件处理: 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用于显示更新和取消按钮。

这是我的代码-behide

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

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

最后,您必须像 GridView1_RowCancelingEdit 一样处理cancling编辑模式,它会尝试显示SelectButton,并隐藏更新和取消按钮。

我根据我在GridView中的列的列索引访问这两个CommandFields:Select按钮的列索引是7,Update和Cancel按钮的列索引是8

答案 1 :(得分:0)

尝试交换两行代码:

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