2012-03-24 2 views
0

У меня есть список в datagrid, который должен обновляться после изменения выбора, и он делает это, но не с первой попытки. только после того, как он будет отправлен назад, после первого нажатия на него он будет работать по назначению. любая помощь оценивается.OnSelectedIndexChanged не работает первый выбор, но будет в последующих выделениях

Ниже приведена передняя часть таблицы данных со списком.

<asp:TemplateColumn HeaderText="Qty"> 
       <ItemStyle HorizontalAlign="Center" Wrap="False" CssClass="grid" /> 
       <HeaderStyle HorizontalAlign="Center" ForeColor="Black" Font-Bold="true" CssClass="grid" width="30" /> 
       <ItemTemplate> 
        <asp:ListBox ID="lstQty" rows="1" runat="server" AutoPostBack="True" EnableViewState="True" OnSelectedIndexChanged="lstQtyUpdate" /> 
       </ItemTemplate> 
      </asp:TemplateColumn> 

Вот раздел загрузки страницы:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    Try 
     If Not IsPostBack Then 
      LoadCart() 
      cartList.Columns(0).Visible = False 
      If (cartList.Items.Count = 0) Then 
       cartList.Visible = False 
       lblEmptyMsg.Visible = True 
      Else 
       cartList.Visible = True 
       lblEmptyMsg.Visible = False 
      End If 
     End If 
    Catch ex As Exception 
     Errorlog(ex, "Cart.Page_Load()") 
    End Try 
End Sub 

Это к югу, что называется с onselectedindexchanged:

Protected Sub lstQtyUpdate(sender As Object, e As System.EventArgs) 
    Dim lb As New ListBox 
    lb = CType(sender, ListBox) 
    Dim thisID As String = lb.ClientID 
    Dim oiQty As Integer = ComFunctions.ConvertToInt(lb.SelectedItem.Value) 
    Dim oiID As Integer = 0 
    For Each item As DataGridItem In cartList.Items 
     lb = CType(item.FindControl("lstQty"), ListBox) 
     If (thisID = lb.ClientID) Then 
      oiID = ComFunctions.ConvertToInt(item.Cells(0).Text) 
      Exit For 
     End If 
    Next..... 

Вот привязки для DataGrid, который может быть виновник.

Private Sub cartList_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles cartList.ItemDataBound 
    Try 
     Dim rbd As ImageButton 
     Dim lst As ListBox 
     Dim id As Integer = 0 
     Dim evTitle As String = String.Empty 
     Dim evImage As String = String.Empty 
     Dim capacity As Integer = 0 
     Dim soldseats As Integer = 0 
     Dim seatsleft As Integer = 0 
     Dim evdate As String = String.Empty 
     Dim evtimestart As String = String.Empty 
     Dim evtimeend As String = String.Empty 
     Dim EditLink As String = String.Empty 
     Dim DeletedLink As String = String.Empty 
     If (e.Item.ItemType = ListItemType.Item) Or (e.Item.ItemType = ListItemType.AlternatingItem) Then 
      id = DataBinder.Eval(e.Item.DataItem, "oi_id") 
      evTitle = ComFunctions.ConvertToStr(DataBinder.Eval(e.Item.DataItem, "title")) 
      evImage = ComFunctions.ConvertToStr(DataBinder.Eval(e.Item.DataItem, "image")) 
      evdate = ComFunctions.ConvertToDate(DataBinder.Eval(e.Item.DataItem, "eventsdatestart")) 
      capacity = ComFunctions.ConvertToStr(DataBinder.Eval(e.Item.DataItem, "capacity")) 
      seatsleft = (capacity - soldseats) 
      evtimestart = ComFunctions.Format_Time((DataBinder.Eval(e.Item.DataItem, "eventsdatestart"))) 
      evtimeend = ComFunctions.Format_Time((DataBinder.Eval(e.Item.DataItem, "eventsdateend"))) 
      Dim obj_DATA_Capacity As New DATA_Events() 
      soldseats = obj_DATA_Capacity.GetSeatsSold(id) 
      e.Item.Cells(0).Text = id 
      e.Item.Cells(1).Text = evTitle & "<br />" & evdate & " " & evtimestart & " - " & evtimeend 
      e.Item.Cells(2).Text = "<img src=""" & AppSettings("Events_ImagePath") & "/Thumb/" & evImage & """ width=""100"" />" 
      e.Item.Cells(3).Text = "$" & ComFunctions.ConvertToDecimal(DataBinder.Eval(e.Item.DataItem, "oi_price"), 2) 
      lst = CType(e.Item.FindControl("lstQty"), ListBox) 
      If seatsleft > 0 Then 
       'lst.Items.Add(0) 
       For I = 1 To seatsleft 
        lst.Items.Add(I) 
       Next 
      End If 
      lst.ID = id 
      lst.SelectedValue = ComFunctions.ConvertToInt(DataBinder.Eval(e.Item.DataItem, "oi_qty")) 
      rbd = CType(e.Item.FindControl("DeleteThis"), ImageButton) 
      rbd.CommandArgument = id 
     End If 

    Catch ex As Exception 
     Errorlog(ex, "quickCart.cartList_ItemDataBound()") 
    End Try 
End Sub 

ответ

0

Я не знаю, почему он не работает в первый раз, кстати, что это «не работает» на самом деле означает? Но кроме того, ваш способ получить текст первой ячейки в текущем DataGridItem нечетен.

Это гораздо более прямо:

Dim lb = DirectCast(sender, ListBox) 
Dim item = DirectCast(lb.NamingContainer, DataGridItem) 
Dim oiID = Int32.Parse(item.Cells(0).Text) 

Может быть, это помогает также получить работу.

+0

это обязательно более прямой и очень ценный. все еще проблема, но позвольте мне объяснить более четко. Когда вы меняете выбор списка, страница мерцает, как будто она вызывается для подставки для OnSelectedIndexChanged, однако она сбрасывается до исходных значений, как это было при загрузке страницы. Выбрав выбор снова, он обновляется корректно, без мерцания страницы. Кроме того, я экспериментировал с добавлением кнопки, которая называлась пустой суб. когда я нажимаю на эту кнопку, страница мерцает, и списки работают так, как они должны. – mbmemb

+0

очевидно, однако, при нажатии кнопки не подходит. не уверен, почему он не работает сам по себе. странно другие элементы управления, кнопки, не взаимодействующие с файлом datagrid. – mbmemb

+0

Я не понимаю, почему вы используете 'DataBinder.Eval'in' ItemDataBound'. Вы можете напрямую использовать базовый DataSource через 'e.Item.DataItem'. –

Смежные вопросы