2010-11-21 2 views
0

저는 InterBase 데이터베이스를 사용하여 ASP.NET 2.0 응용 프로그램을 확장하려고합니다. 내 경험은 PHP/MySQL에 있으므로 ASP에 대한 내 친숙도는 현재 2 주 범위에 있으며 동료 코드, ASP 책의 첫 90 페이지 및 Google을 검토하여 함께 연결됩니다. 이 응용 프로그램에서는 SqlDataSource 컨트롤을 사용하여 데이터베이스에 연결하고 필요한 정보를 선택합니다. 그런 다음 결과가 하나의 열에서 데이터를 수정하는 DataView로 복사 된 다음 그 DataView를 출력용 GridView로 푸시합니다. 내가 겪고있는 문제는이 시점에서 GridView를 정렬 할 수 없다는 것입니다. 나는 여기서 지침을 따라 갔다 : http://forums.asp.net/p/956540/1177923.aspx, 그러나 아무 소용이 없습니다. 여기 C#을 사용하여 ASP.NET 2.0에서 DataView로 채워진 GridView를 정렬 할 수 없습니다.

페이지 코드 :

<form id="form1" runat="server"> 
<div> 
    <asp:SqlDataSource ID="Products" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString1 %>" 
     ProviderName="<%$ ConnectionStrings:ConnectionString1.ProviderName %>" OnLoad="ProductsDS_Load" 
     OnSelected="ProductsDS_Selected" DataSourceMode="DataSet"> 
    </asp:SqlDataSource> 

    <br /> 
    <asp:Label ID="testlabel" runat="server"></asp:Label> 
    <br /> 
    <asp:Label ID="testlabel2" runat="server"></asp:Label> 
    <br /><br /> 
    This table lists all 2000+ numbered projects which are at least partially in process.<br /> 
    The Project number link leads to a more detailed view of that project.<br /> 
    <br /> 
    <asp:Label runat="server" ID="numrows"></asp:Label> results returned. 
    <br /> 
    <asp:GridView ID="ProductsView" runat="server" EnableModelValidation="True" 
     AutoGenerateColumns="False" CellPadding="4" OnSorting="ProductsView_Sorting" 
     ForeColor="#333333" GridLines="None" AllowSorting="True"> 
     <AlternatingRowStyle BackColor="White" /> 
     <Columns> 
      <asp:HyperLinkField HeaderText="Project" SortExpression="PROJECT" 
       DataTextField="PROJECT" Target="subweeklyreport" DataNavigateUrlFields="PROJECT" 
       DataNavigateUrlFormatString="Products.aspx?p={0}" /> 
      <asp:BoundField Visible="false" DataField="PROJECTID" /> 
      <asp:BoundField DataField="PART" HeaderText="Part #" 
       SortExpression="PART" /> 
      <asp:BoundField DataField="DESCRIPTION" HeaderText="Description" 
       SortExpression="DESCRIPTION" /> 
      <asp:BoundField DataField="ENGMGR" HeaderText="Eng. Mgr." 
       SortExpression="ENGMGR" /> 
     </Columns> 
     <EditRowStyle BackColor="#7C6F57" /> 
     <FooterStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" /> 
     <HeaderStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" /> 
     <PagerStyle BackColor="#666666" ForeColor="White" HorizontalAlign="Center" /> 
     <RowStyle BackColor="#E3EAEB" /> 
     <SelectedRowStyle BackColor="#C5BBAF" Font-Bold="True" ForeColor="#333333" /> 
    </asp:GridView> 
</div> 
</form> 

그리고 여기 뒤에 코드 :

protected void ProductsDS_Load(object sender, EventArgs e) 
{ 

    string SQLQuery = Query would go here; 

    testlabel2.Text = SQLQuery; 
    Products.SelectCommand = SQLQuery; 
    Products.DataBind(); 

    DataView dv = (DataView)Products.Select(new DataSourceSelectArguments()); 

    foreach (DataRow dr in dv.Table.Rows) 
    { 
     string name = dr["ENGMGR"].ToString(); 
     string[] explode = name.Split(' '); 
     string newname; 
     if (explode.Length == 3) 
     { 
      newname = explode[2] + ", " + explode[0]; 
     } 
     else 
     { 
      newname = explode[1] + ", " + explode[0]; 
     } 

     dr["ENGMGR"] = newname; 
     //testlabel.Text = dr["ENGMGR"].ToString(); 
    } 


    Products.DataBind(); 
    //ProductsView.DataSourceID = "Products"; 
    ProductsView.DataSource = dv; 
    ProductsView.DataBind(); 
    ProductsView.Enabled = true; 
    ProductsView.Visible = true; 

} 

protected void ProductsDS_Selected(object sender, SqlDataSourceStatusEventArgs e) 
{ 
    numrows.Text = e.AffectedRows.ToString(); 
} 

protected void ProductsView_Sorting(object sender, GridViewSortEventArgs e) 
{ 
    DataTable dataTable = ProductsView.DataSource as DataTable; 

    if (dataTable != null) 
    { 
     DataView dataView = new DataView(dataTable); 
     dataView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection); 

     ProductsView.DataSource = dataView; 
     ProductsView.DataBind(); 
    } 
} 

private string ConvertSortDirectionToSql(SortDirection sortDirection) 
{ 
    string newSortDirection = String.Empty; 

    switch (sortDirection) 
    { 
     case SortDirection.Ascending: 
      newSortDirection = "ASC"; 
      break; 

     case SortDirection.Descending: 
      newSortDirection = "DESC"; 
      break; 
    } 

    return newSortDirection; 
} 

내가 무슨 일이 일어나고 생각하면의 GridView가 정렬에 대한 포스트 백을 수행 할 때마다, 그 원인이다는 쿼리를 다시 실행하고 GridView에서 기존 데이터를 정렬하려는 시도를 덮어 씁니다. 그러나이 문제를 방지하기 위해 현재 ASP에 대해 충분히 알지 못합니다. 어떤 도움이라도 대단히 감사 할 것입니다.

답변

0

나는 내 자신의 문제를 해결했다. 페이지로드 사이의 데이터 뷰를 저장하고 쿼리를 실행하기 전에 데이터 뷰가 저장되어 있는지 확인하고 세션 데이터가 있으면 정렬하고 그렇지 않으면 일반 쿼리를 수행하기위한 세션 변수를 만들었습니다. 초기 페이지 뷰와 정렬 사이에 데이터가 도입 될 것으로 기대하지 않기 때문에 데이터의 저장된 복사본을 사용하는 것이 큰 문제는 아니라고 생각합니다.