2013-12-10 107 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; 
}