2013-12-10 70 views
0

我有其经由SQL数据源填充了SELECT命令一个gridview:Select * FROM myTableasp.net gridview的编辑模式索引

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

在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 + "'"; 
     } 
+0

必须显示问题相关的代码 – Shaharyar

+0

添加但没有比我提到的更多。我相信这是与回发有关的事情,并且在gridview只显示一条记录之后,当gridview有多行时,它仍然具有EditIndex值。 –

+0

基本上gridview后只显示一条记录editIdex将始终为0(因为只有行返回) –

回答

1

GridView控件将再次自动绑定数据。这使得它返回到开始模式(在GridView中使用Edit按钮显示只读数据)。

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

这是我的GridView与SqlDataSource1结合数据,有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> 

我有两个CommandFields: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; 
} 

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

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

最后,您必须处理canrling编辑模式,如GridView1_RowCancelingEdit,它们尝试显示SelectButton,并隐藏Update和Cancel按钮。

我通过他们的列索引来访问这两个CommandFields根据我的GridView列:选择按钮的列索引是7和更新的列索引和取消按钮是8

+0

好吧,我看到你想要做什么,这听起来像个好主意。但是,无论何时在不是第一个(索引0)的行上按下Select时,它总是从第0行中选择数据。 –

+0

您必须检查传递给查询的** ID **是否正确。把断点放在这一行** SqlDataSource1.SelectCommand =“SELECT * FROM [myTable] WHERE ID ='”+ ID +“'”; **并检查ID值。 – Alice

+0

在你的** gvResults_SelectedIndexChanged **方法中,你应该从'gvResults.SelectedIndex'得到正确的选择行索引,并且如果你在GridView中设置了'DataKeyNames =“ID”',那么你也应该得到正确的ID这个代码**'string ID = gvResults.DataKeys [gvResults.SelectedIndex] .Value.ToString(); **(在** gvResults_SelectedIndexChanged **方法中实现) – Alice

0

尝试交换两个行代码:当您设置一个新的命令SqlDataSource1.SelectCommand

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