2013-09-10 113 views
0

我的搜索按鈕鏈接到一個GridvieW,它在每一行都有一個編輯按鈕。當我按下搜索按鈕時,數據發生變化並出現一個數據綁定()。 之後,如果我嘗試使用編輯按鈕,它會顯示另一行進行編輯,而不是選定的那一行(最大的問題)。兩個按鈕在單獨測試時工作良好,但不是一個接一個地測試。我解決了從編輯按鈕事件中刪除GridView1.DataBind(),但然後它需要2次點擊來顯示編輯模板(另一個問題)。Gridview:搜索後編輯

編輯:我猜問題是在搜索按鈕。你能給出一個不依賴於sqldatasource的好搜索代碼嗎?

'Where data is loaded into GV 
Dim SqlDataSource1 As New SqlDataSource 

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

    SqlDataSource1.SelectCommand = "SELECT * FROM [TABLE]" 
    SqlDataSource1.ConnectionString = "Conn String" 

    If Not IsPostBack Then 

     Dim conn As New SqlConnection 
    conn.ConnectionString = con.GetConnectionString 
    Dim cmd As New SqlCommand() 
    cmd.CommandText = "SELECT [AREA], [LEADER_USER] FROM [AREA]" 
    cmd.CommandType = CommandType.Text 
    cmd.Connection = conn 
    conn.Open() 
    Dim adpt As New SqlDataAdapter(cmd) 
    Dim ds As New DataSet() 
    adpt.Fill(ds) 
    GridView1.DataSource = ds 
    GridView1.DataBind() 
    conn.Close() 
    End If 

End Sub 

'Search button 
Protected Sub btnSearch_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSearch.Click 

    Try 
     SqlDataSource1.SelectCommand = "SELECT * FROM TABLE WHERE id LIKE @id" 
     SqlDataSource1.SelectParameters.Clear() 
     SqlDataSource1.SelectParameters.Add(New Parameter("id", DbType.String, "%" + txtSearch.Text + "%")) 
     GridView1.DataSource = SqlDataSource1 
     GridView1.DataBind() 
    Catch ex As Exception 
     MsgBox(ex.ToString) 
    End Try 

End Sub 

'Edit button 
Protected Sub EditRow(ByVal sender As Object, ByVal e As GridViewEditEventArgs) 

    GridView1.EditIndex = e.NewEditIndex 
    GridView1.DataSource = SqlDataSource1 
    GridView1.DataBind() 

End Sub 

標記:

<asp:TextBox ID="TextBox1" runat="server" BackColor="#D9ECFF" 
             style="height: 20px; width: 186px" AutoPostBack="True"></asp:TextBox> 
<asp:Button ID="btnSearch" runat="server" BackColor="#0066cc" 
             BorderColor="#0066cc" BorderStyle="Outset" Font-Bold="True" ForeColor="White" 
             style=" height: 26px; width: 56px" Text="Search" /> 

<asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True" 
AutoGenerateColumns="False" CellPadding="4" OnRowEditing="EditRow" 
OnRowCancelingEdit="CancelEditRow" DataKeyNames="AREA" DataMember="DefaultView"> 

    <Columns> 
    <asp:BoundField DataField="AREA" HeaderText="AREA" ReadOnly="True" 
             SortExpression="AREA" />         

     <asp:TemplateField HeaderText="LEADER_USER" SortExpression="LEADER_USER"> 
        <ItemTemplate><%#Eval("leader_user")%></ItemTemplate> 
         <EditItemTemplate> 
          <asp:TextBox ID="txtleaderuser" runat="server" Text='<%#Eval("leader_user")%>'/> 
         </EditItemTemplate> 
     </asp:TemplateField> 

     <asp:TemplateField>          
      <ItemTemplate> 
        <asp:ImageButton ID="editButton" runat="server" CommandName="Edit" 
               ImageUrl="images/pencil1.png" Text="Edit" ToolTip="Edit" /> 
      </ItemTemplate> 
      <EditItemTemplate> 
        <asp:Button ID="BtnUpdate" runat="server" CommandName="Update" 
               Text="Update" /> 
        <asp:Button ID="BtnCancel" runat="server" CommandName="Cancel" 
               Text="Cancel" /> 
       </EditItemTemplate> 
      </asp:TemplateField> 

     </Columns> 
    </asp:GridView> 

請幫助我。這2個gridview功能如何被編碼爲一起工作?這是我知道如何做到這一點的唯一方法,但是如果它有效,任何想法都可以。如果你是一個C#的傢伙,你CA使用C#-to VB轉換器: http://www.developerfusion.com/tools/convert/csharp-to-vb/

+0

你是如此接近使用ADO.NET(的SqlCommand,SqlConnection的,等等),爲什麼不走一路和擺脫的SqlDataSource的?我認爲你編輯中發生的事情是,你在搜索中對SqlDataSource所做的更改不會持久。 「SqlDataSource1」的標記是什麼樣的? –

+0

不好意思,我不知道如何在沒有SQldatasource的情況下做到這一點,如果你能告訴我它會很棒。並且沒有針對SqlDataSource1的asp代碼,它可以在後面的代碼中聲明,如您所見。 – phalanx

+0

顯示您的GridView標記也 –

回答

1

試試這個:

fill_grid() 
     { 
// populate your grid 
      SqlCommand cmd = new SqlCommand(); 

     cmd.CommandText = " your select statement "; 


     cmd.CommandType = CommandType.Text; 
     cmd.Connection = this.sqlConnection1; 
     this.yourConnection .Open(); 
     SqlDataAdapter adpt = new SqlDataAdapter(cmd); 
     DataSet ds = new DataSet(); 
     adpt.Fill(ds); 
     yourGrid.DataSource = ds; 
     yourGrid.DataBind(); 

     this.sqlConnection1.Close(); 
    } 

然後勾到您的搜索按鈕,這樣該按鈕單擊事件:

yourButton_Click ((object sender, EventArgs e) 
     { 
      GridViewRow clickedRow = ((Button)sender).NamingContainer as GridViewRow; 

    //Then find your parameter from your textbox in the clicked row 

      TextBox yourbox = (TextBox)clickedRow.FindControl("your_box"); 

      //Here is where you would all your search logic whatever that is 

     } 

然後,您仍然可以使用row_updating事件,而不受搜索按鈕單擊事件的影響。

+0

對不起,我想我沒有正確解釋它:搜索按鈕不在網格中,我不需要點擊任何行來執行搜索。標記在上面。無論如何,感謝fill_grid()部分。 – phalanx

+0

哦,在這種情況下,您可以將fill_grid()放在您的按鈕點擊事件中作爲搜索按鈕 – briskovich

+0

不,不起作用。我複製粘貼fill_grid()代碼並添加參數,如下所示:cmd.Parameters.AddWithValue(「@ id」,TextBox1.Text),沒有結果。 – phalanx

0

您可以在page_load中通過if命令添加Where語句並刪除btnSearch_Click函數中的哪個位置。這樣

if (txtSearch.Text.length()>0) 
    SqlDataSource1.SelectCommand += "WHERE id LIKE @id" 

,然後它工作正常