Ошибка при редактировании CommandName в представлении сетки после поиска

У меня есть GridView с текстовым полем, которое выполняет поиск в сетке, а также кнопка редактирования внутри сетки. Все они хорошо работают при индивидуальном тестировании, но если я попытаюсь использовать кнопку поиска, а затем использовать кнопку редактирования, это не изменит правую строку. Пример: скажем, у меня есть 3 строки в моем GridView:

Search:_________
Air    Edit 
Earth  Edit 
Sea    Edit 

Если я напишу «море» в текстовом поле и нажму кнопку поиска, в сетке будет отображаться только «море», а когда я нажму «Редактировать», для редактирования будет отображаться запись «Воздух» вместо морской записи. Почему это происходит и как это решить?

ИЗМЕНИТЬ: Код ASP:

    <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>

Код поиска позади:

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim miCon As New Connection
        Try
            SqlDataSource1.ConnectionString = miCon.GetConnectionString()
            SqlDataSource1.SelectCommand = "SELECT * FROM AREA WHERE area LIKE @area"
            SqlDataSource1.SelectParameters.Clear()
            SqlDataSource1.SelectParameters.Add(New Parameter("area", DbType.String, "%" + TextBox1.Text + "%"))
            GridView1.DataBind()
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try

    End Sub

Любая помощь?


person phalanx    schedule 06.09.2013    source источник


Ответы (1)


Не видя весь ваш код, я предполагаю, что ваша кнопка редактирования отправляется обратно на сервер, и снова выполняется начальная логика привязки для сетки, которая не принимает во внимание значение, введенное в поле поиска; таким образом, первая строка снова будет Air, как и до того, как вы выполнили поиск.

Чтобы это остановить, добавьте в событие Page_Load следующее:

Protected Sub Page_Load(sender As Object, e As EventArgs)
    If Not IsPostBack Then
    ' Put logic here to bind the grid only when page is first loaded

    End If
End Sub
person Karl Anderson    schedule 06.09.2013
comment
Куда вы изначально привязываете свою сетку, Page_Load? - person Karl Anderson; 06.09.2013
comment
Нет, кода привязки нет, за исключением события нажатия кнопки поиска (см. Код выше). Я думаю, это происходит автоматически, потому что я использую источник данных (см. Код asp) - person phalanx; 06.09.2013
comment
Хорошо, тогда как вы видите три строки в своем примере, прежде чем ввести море в поле поиска? - person Karl Anderson; 06.09.2013
comment
GridView связан с ‹asp: SqlDataSource›, поэтому мне не нужно было использовать код vb для привязки к сетке. - person phalanx; 06.09.2013
comment
Что-то должно вызвать .DataBind() для выполнения SelectCommand части SqlDataSource; в противном случае вы бы вообще не увидели никаких строк. - person Karl Anderson; 06.09.2013
comment
Я собираюсь поместить свой .DataBind () в код vb позади. Как я могу сказать привязать сетку только тогда, когда страница сначала загружается в коде vb? - person phalanx; 07.09.2013
comment
Нет, продолжает выходить из строя даже после добавления If Not IsPostBack - person phalanx; 11.09.2013