2012-10-01 3 views
0

select 쿼리와 gridview에 연결된 DDL이 포함 된 ASP 페이지가 있습니다. pageLoad 후에 값을 선택하고 gridview를 아무 문제없이 채울 수 있습니다.ASP 포스트 백이 모든 컨트롤을 게시하지 않았습니다.

<asp:DropDownList ID="DropDownList3" runat="server" OnSelectedIndexChanged="DropDownList3_SelectedIndexChanged" AutoPostBack="True"> 
<asp:ListItem>Select an entry</asp:ListItem> 
<asp:ListItem>Requested</asp:ListItem> 
<asp:ListItem>Requested and Closed</asp:ListItem> 
<asp:ListItem>Ordered</asp:ListItem> 
<asp:ListItem>Working</asp:ListItem> 
<asp:ListItem>Warranty Parts</asp:ListItem> 
<asp:ListItem>Warranty Service</asp:ListItem> 
<asp:ListItem>Filled</asp:ListItem> 
</asp:DropDownList> 

protected void DropDownList3_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    //string choice = DropDownList3.SelectedItem.Text; 
    int index = DropDownList3.SelectedIndex; 
    string query; 
    switch (index) 
    { 
     case 0: 
      { 
       query = "SELECT TOP 100 [last_name], [zpart_used_manual], [zpart_used_SN], [serial_number], [ref_num], [status], [summary], [id], [zpart_used_completed] FROM [VIEW_USS_ICG_Parts_Requested] ORDER BY [last_name]"; 
       break; 
      } 
     case 1: 
      { 
       query = "SELECT TOP 100 [last_name], [zpart_used_manual], [zpart_used_SN], [serial_number], [ref_num], [status], [summary], [id], [zpart_used_completed] FROM [VIEW_USS_ICG_Parts_Requested] WHERE [status]='WAIT-PR' ORDER BY [last_name]"; 
       break; 
      } 
     case 2: 
      { 
       query = "SELECT [last_name], [zpart_used_manual], [zpart_used_SN], [serial_number], [ref_num], [status], [summary], [id], [zpart_used_completed] FROM [VIEW_USS_ICG_Parts_Requested] WHERE ([zpart_used_completed] IS NULL) AND ([status]='WAIT-PR' OR [status]='CLO') ORDER BY [last_name]"; 
       break; 
      } 
     case 3: 
      { 
       query = "SELECT TOP 100 [last_name], [zpart_used_manual], [zpart_used_SN], [serial_number], [ref_num], [status], [summary], [id], [zpart_used_completed] FROM [VIEW_USS_ICG_Parts_Requested] WHERE [status]='WAIT-PO' ORDER BY [last_name]"; 
       break; 
      } 
     case 4: 
      { 
       query = "SELECT TOP 100 [last_name], [zpart_used_manual], [zpart_used_SN], [serial_number], [ref_num], [status], [summary], [id], [zpart_used_completed] FROM [VIEW_USS_ICG_Parts_Requested] WHERE [status]='WORK' ORDER BY [last_name]"; 
       break; 
      } 
     case 5: 
      { 
       query = "SELECT TOP 100 [last_name], [zpart_used_manual], [zpart_used_SN], [serial_number], [ref_num], [status], [summary], [id], [zpart_used_completed] FROM [VIEW_USS_ICG_Parts_Requested] WHERE [status]='WAIT - WP' OR [status]='WAIT-W' ORDER BY [last_name]"; 
       break; 
      } 
     case 6: 
      { 
       query = "SELECT [last_name], [zpart_used_manual], [zpart_used_SN], [serial_number] , [ref_num], [status], [summary], [id], (SELECT [DDvalue] FROM zpartStatuses WHERE [code] = [zpart_used_completed]) AS [zpart_used_completed] FROM View_USS_ICG_Parts_Requested INNER JOIN zpartStatuses ON [zpart_used_completed] = zpartStatuses.code WHERE ([status] = 'WAIT - WS')ORDER BY [last_name]"; 
       break; 
      } 
     case 7: 
      { 
       query = "SELECT [last_name], [zpart_used_manual], [zpart_used_SN], [serial_number], [ref_num], [status], [summary], [id], [zpart_used_completed] FROM [VIEW_USS_ICG_Parts_Requested] WHERE [zpart_used_completed] = '1' ORDER BY [last_name]"; 
       //query = "SELECT TOP 100 [last_name], [zpart_used_manual], [zpart_used_SN], [serial_number], [ref_num], [status], [summary], [id], [zpart_used_completed] FROM [VIEW_USS_ICG_Parts_Requested] ORDER BY [last_name]"; 
       break; 
      } 
     default: 
      { 
       query = "SELECT TOP 100 [last_name], [zpart_used_manual], [zpart_used_SN], [serial_number], [ref_num], [status], [summary], [id], [zpart_used_completed] FROM [VIEW_USS_ICG_Parts_Requested] ORDER BY [last_name]"; 
       break; 
      } 

    } 
    SqlConnection sqlConnection = new SqlConnection(@"Data Source=XXX.XXX.XXX.XXX;Initial Catalog=mdb;Persist Security Info=True;User ID=user;Password=pass"); 
    SqlCommand sqlCommand = new SqlCommand(query, sqlConnection); 
    sqlConnection.Open(); 
    SqlDataReader reader = sqlCommand.ExecuteReader(); 
    GridView1.DataSource = reader; 
    GridView1.DataBind(); 

} 

gridview 내에서 해당 행에 대한 업데이트 쿼리를 트리거하는 다른 DDL을 포함하는 항목 템플릿이 있습니다.

<asp:DropDownList ID="DropDownList4" runat="server" DataSourceID="SqlDataSource1" 
DataTextField="DDvalue" DataValueField="code" Height="20px" Width="150px" 
AutoPostBack="True" CommandName="DD4" OnSelectedIndexChanged = "DDL4_SelectedIndexChanged"> 
</asp:DropDownList>   

protected void DDL4_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    string sqlQueryString2 = "UPDATE [act_log] SET [zpart_used_completed]= @status, [zpart_used_status] = @date WHERE [id] = @id"; 
    SqlConnection sqlConnectionCmdString2 = new SqlConnection(@"Data Source=XXX.XXX.XXX.XXX;Initial Catalog=mdb;Persist Security Info=True;User ID=user;Password=pass"); 
    int status; 
    GridViewRow gr = (GridViewRow)((DataControlFieldCell)((DropDownList)sender).Parent).Parent; 
    DropDownList d4 = (DropDownList)gr.FindControl("DropDownList4"); 
    status = d4.SelectedIndex; 
    string id = GridView1.Rows[gr.RowIndex].Cells[10].Text;    
    sqlConnectionCmdString2.Open(); 
    SqlCommand sqlQueryCmd2 = new SqlCommand(sqlQueryString2, sqlConnectionCmdString2); 
    sqlQueryCmd2.Parameters.Add("@id", id); 
    sqlQueryCmd2.Parameters.Add("@status", status); 
    sqlQueryCmd2.Parameters.Add("@date", DateTime.Now.ToShortDateString()); 
    sqlQueryCmd2.ExecuteNonQuery(); 
    sqlQueryCmd2.Dispose(); 
    sqlConnectionCmdString2.Close(); 
    GridView1.DataBind(); 

} 

둘 다 AutoPostBack에 대해 DDL이 설정됩니다. 문제는 이벤트가 DropDownList4에서 트립되었을 때 페이지를 다시 DropDownList3의 결과로 가져 오지 않는다는 것입니다. 대신 페이지가 당기는 것은 다음과 같습니다.

<EmptyDataTemplate> 
No records could be retrieved from the database. We apologize for the invonvenience. 
</EmptyDataTemplate> 

각 수정시 그리드 뷰를 새로 고치려면 어떻게해야합니까?

+0

.cs 파일에 코드를 게시하여 진행 상황을 확인하십시오. –

답변

0

AutoPostBack 속성은 포스트 백이 발생합니다 (분명히). !IsPostBack에서 this.Databind();을 삭제하십시오.

if (!IsPostBack) { 
    this.DataBind(); 
} 

가된다 :

this.DataBind(); 

이 업데이트 :

당신의 ViewState가의 GridView에서 사용할 수 있습니까?

는 업데이트 :

좋아, 이제 문제를 볼 생각합니다.

GridView1.DataSource = reader; 
GridView1.DataBind(); 

를 다음의 DDL4_SelectedIndexChanged 게시 처리기에서, 다른 데이터 소스를 지정하지 않고 GridView1를 리 바인드하려고 : DropDownList3_SelectedIndexChanged에 대한 처리기에서는 GridView1에 대한 DataSource을 설정합니다. GridView1은 (영문 마크 업) 선언적의 DataSource 세트가 있다면

GridView1.DataBind(); 

,이 문제가되지 않을 것입니다. 그러나 DataSource 속성이 동적으로 (코드 숨김으로) 설정되면 자동으로 유지되지 않는 것은 제 경험이었습니다.

해결 방법은 Select 쿼리를 다시 실행하고 다시 바인딩하기 전에 데이터 소스를 다시 설정하거나 수동으로 데이터 소스를 유지 한 다음 원하는대로 다시 바인딩하는 것입니다.

데이터 소스를 수동으로 유지하려면 일반적으로 ViewState에 저장하는 보호 된 페이지 속성을 사용합니다.

protected SqlDataReader GridView1DataSource { 
    get { 
     SqlDataReader reader = null; 

     if (ViewState("SomeStringUniqueToThePageThatICanUseAsAKeyAndRemainsDescriptive") != null) { 
      reader = ViewState("SomeStringUniqueToThePageThatICanUseAsAKeyAndRemainsDescriptive"); 
     } 

     return reader; 
    } 
    set { ViewState("SomeStringUniqueToThePageThatICanUseAsAKeyAndRemainsDescriptive") = value; } 
} 

나서

  1. 페이지 속성

    GridView1.DataSource = this.GridView1DataSource;

  2. 에 데이터 소스를 설정하는 페이지 속성

    this.GridView1DataSource = reader;

  3. 세트

  4. 리 바인드 당신은-실행 다시이 당신이 이러한 기술을 모두 사용할 수없는 이유는 없지만, 당신이 실제로 업데이트 할 데이터 소스를 필요로하는 경우, 당신이해야합니다

    GridView1.DataBind();

에 필요할 때마다 쿼리를 페이지 속성에서 다시 유지하기 전에

데이터 소스를 실제로 업데이트 할 필요가없는 경우 데이터 소스를 DDL4_SelectedIndexChanged 포스트 백 처리기에서 리 바인드 할 필요가 없을 수도 있습니다.

+0

아니요, 변경, 같은 문제. – user1431356

+0
+0

지금 리바 인 문제가 있습니다. 복사/붙여 넣기가 실패합니다. :(당신이 말한 것 중 나머지는 논리적으로 보이지만, 한 번에 내 머리 속에 들어갈 수있는 것보다 4oz 정도 더 많습니다. 언젠가는 처리하기 위해 나를 데려 갈 것입니다. 그런데 리바 인드를 DropDownList3_SelectedIndexChanged (null, null); 그것은 약간의 골칫거리이지만, 다시 쿼리를 수행하고 내가 취한 행동과 정확히 일치하는 각 액션에 대한 즉각적인 재검토를 제공합니다. 감사합니다! – user1431356

관련 문제