2015-10-25 3 views
2

В приложении ASP.NET WebForms есть только два элемента управления на странице aspx, DropDownList и GridView. Не существует выбранного значения DropDownList по умолчанию на странице_Load. Изменение выбора в DropDownList точно заполняет GridView.GridView не заполняется на Page_Load, но в PostBack или Refresh

Когда страница запрашивается с параметром URL, такие как .../View_Details.aspx?C_ID=123, выбранное значение в DropDownList изменений, но GridView не заселить в первый раз, но обновления страницы показывает записи для данного параметра URL.

ASPX разметки:

<%@ Page Title="Data" Language="vb" AutoEventWireup="false" MasterPageFile="~/HomePage.Master" CodeBehind="View_Details.aspx.vb" Inherits="App1.View_Details" %> 

<asp:Content ID="Content4" ContentPlaceHolderID="BodyCP" runat="server"> 
<asp:DropDownList ID="CIDCombo" runat="server" DataSourceID="SqlDSCID" DataTextField="CName" DataValueField="CID" AutoPostBack="true"></asp:DropDownList> 
<asp:SqlDataSource ID="SqlDSCID" runat="server" ... ></asp:SqlDataSource> 

<asp:GridView ID="gvData" runat="server" AutoGenerateColumns="false"> 
    <Columns> 
     <asp:BoundField DataField="Fld1" /> 
     <asp:BoundField DataField="Fld2" /> 
     ... 
    </Columns> 
</asp:GridView> 
</asp:Content> 

Код За:

Private C_ID As Long 
Dim con As SqlConnection = New SqlConnection(ConfigurationManager.Connect...) 
Dim cmd As New SqlCommand() 
Dim stSqlQry As String = "" 

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    C_ID = CLng(Request.QueryString("C_ID")) 
    If IsPostBack Then 

    Else 
     If C_ID > 0 Then 
      CIDCombo.SelectedValue = C_ID.ToString 
      LoadGVData(C_ID) 
     End If 
    End If 
End Sub 

Private Sub CIDCombo_SelectedIndexChanged(sender As Object, e As System.EventArgs) Handles CIDCombo.SelectedIndexChanged 
    If CIDCombo.SelectedIndex >= 0 AndAlso CLng(CIDCombo.SelectedValue) > 0 Then 
     LoadGVData(CLng(CIDCombo.SelectedValue)) 
    End If 
End Sub 

Private Sub LoadGVData(ByVal lnCID As Long) 
    Try 
     If con.State <> ConnectionState.Open Then con.Open() 
     Dim da As SqlDataAdapter = New SqlDataAdapter() 
     stSqlQry = "SELECT Fld1, Fld2 ... WHERE CID = @CID" 
     da = New SqlDataAdapter() 
     cmd = New SqlCommand(stSqlQry, con) 
     cmd.Parameters.AddWithValue("@CID", lnCID) 
     Dim dtDataTableInc As DataTable = New DataTable("t_Data") 
     da.SelectCommand = cmd 
     da.Fill(dtDataTableInc) 
     'SOME DATA MANIPULATION WITH DATATABLE' 

     '****************************************************************************' 
     'DEBUG MODE SHOWS DataTable HAS ROWS BUT DON'T SHOW UP FIRST TIME IN GRIDVIEW' 
     '****************************************************************************' 
     gvData.DataSource = dtDataTableInc 
     gvData.DataBind() 
    Catch ex As Exception 
     'EXCEPTION HANDLING 
    Finally 
     If con.State <> ConnectionState.Closed Then con.Close() 
    End Try 
End Sub 
+0

Поскольку вы говорите, что используете UpdatePanels: если вы не используете ни один из них, правильно ли заполняется сетка? – ConnorsFan

+0

Я позволю мне проверить это, но скажем, что необходимо использовать UpdatePanels, тогда в этом случае может быть решение? – haraman

+0

Еще одна гипотеза: может ли событие Load оказаться слишком ранним для привязки данных сетки? Не могли бы вы попробовать в событии PreRender (или LoadComplete)? – ConnorsFan

ответ

0

Я вижу, у вас есть AutoEventWireup="false" поставить его на истинный.

Просто общее примечание:

При работе с DropDownLists и использованием AutoPostBack=True гримом использования UpdatePanel, поскольку пользователь получает разочарование, когда он всегда видеть белую страницу мерцающего :)

если вы используете UpdatePanel использовать Onload событие для заполнения данных и положить UpdateMode=Conditional

удачи и счастливого кодирования.

+0

Пока страница загружается в первый раз (IsPostBack всегда будет ложной), DataTable имеет записи, а затем присваивает их сетке вместе с DataBind должен отображать записи. А что касается UpdatePanel, они уже используются. Я разместил только соответствующий код. ** PostBack/refresh НЕ является проблемой. Я уже упоминал, что проблема - первая загрузка ** – haraman

+0

Okey lemme думаю далее –

+0

обновил мой ответ –