2011-09-28 2 views
0

이 데이터 격자를 정렬하는 더 좋은 방법이 있습니까?GridView 정렬 - asp.net (sharepoint)에서 gridview 정렬을 수행하는 더 좋은 방법이 있습니까?

이것은 작동하지만 조금 재사용 할 수없는 것처럼 보입니다.

아이디어가 있거나 더 좋은 방법이 있으면 알려 주시기 바랍니다.

다음은 코드입니다. 아이디어가 있으면 알려주세요.

protected void grdPropMgrLeaseAgents_Sorting(object sender, GridViewSortEventArgs e) 
    { 
     string sortExpression = "A"; 

     if (ViewState[e.SortExpression + "_sort"] != null) 
     { 
      sortExpression = ViewState[e.SortExpression + "_sort"].ToString(); 
     } 

     List<Person> list = (List<Person>)ViewState["propertyManagersAndLeasingAgents"]; 

     if (sortExpression == "A") 
     { 
      if (e.SortExpression == "EmpFullName") list.Sort((x, y) => string.Compare(x.EmpFullName, y.EmpFullName)); 
      if (e.SortExpression == "FirstName") list.Sort((x, y) => string.Compare(x.FirstName, y.FirstName)); 
      if (e.SortExpression == "LastName") list.Sort((x, y) => string.Compare(x.LastName, y.LastName)); 
      if (e.SortExpression == "DepartmentName") list.Sort((x, y) => string.Compare(x.DepartmentName, y.DepartmentName)); 
      if (e.SortExpression == "MarketName") list.Sort((x, y) => string.Compare(x.MarketName, y.MarketName)); 
      if (e.SortExpression == "Title") list.Sort((x, y) => string.Compare(x.Title, y.Title)); 
      if (e.SortExpression == "Roles") list.Sort((x, y) => string.Compare(x.Roles, y.Roles)); 
      if (e.SortExpression == "CellPhone") list.Sort((x, y) => string.Compare(x.CellPhone, y.CellPhone)); 
      if (e.SortExpression == "OfficePhone") list.Sort((x, y) => string.Compare(x.OfficePhone, y.OfficePhone)); 
      if (e.SortExpression == "EmailAddress") list.Sort((x, y) => string.Compare(x.EmailAddress, y.EmailAddress)); 
      if (e.SortExpression == "City") list.Sort((x, y) => string.Compare(x.City, y.City)); 
      if (e.SortExpression == "State") list.Sort((x, y) => string.Compare(x.State, y.State)); 
      if (e.SortExpression == "PropertyName") list.Sort((x, y) => string.Compare(x.PropertyName, y.PropertyName)); 
      if (e.SortExpression == "PropertyStreet") list.Sort((x, y) => string.Compare(x.PropertyStreet, y.PropertyStreet)); 
      if (e.SortExpression == "DisplayName") list.Sort((x, y) => string.Compare(x.DisplayName, y.DisplayName)); 
      if (e.SortExpression == "ZipCode") list.Sort((x, y) => string.Compare(x.ZipCode, y.ZipCode)); 
     } 
     else 
     { 
      if (e.SortExpression == "EmpFullName") list.Sort((y, x) => string.Compare(x.EmpFullName, y.EmpFullName)); 
      if (e.SortExpression == "FirstName") list.Sort((y, x) => string.Compare(x.FirstName, y.FirstName)); 
      if (e.SortExpression == "LastName") list.Sort((y, x) => string.Compare(x.LastName, y.LastName)); 
      if (e.SortExpression == "DepartmentName") list.Sort((y, x) => string.Compare(x.DepartmentName, y.DepartmentName)); 
      if (e.SortExpression == "MarketName") list.Sort((y, x) => string.Compare(x.MarketName, y.MarketName)); 
      if (e.SortExpression == "Title") list.Sort((y, x) => string.Compare(x.Title, y.Title)); 
      if (e.SortExpression == "Roles") list.Sort((y, x) => string.Compare(x.Roles, y.Roles)); 
      if (e.SortExpression == "CellPhone") list.Sort((y, x) => string.Compare(x.CellPhone, y.CellPhone)); 
      if (e.SortExpression == "OfficePhone") list.Sort((y, x) => string.Compare(x.OfficePhone, y.OfficePhone)); 
      if (e.SortExpression == "EmailAddress") list.Sort((y, x) => string.Compare(x.EmailAddress, y.EmailAddress)); 
      if (e.SortExpression == "City") list.Sort((y, x) => string.Compare(x.City, y.City)); 
      if (e.SortExpression == "State") list.Sort((y, x) => string.Compare(x.State, y.State)); 
      if (e.SortExpression == "PropertyName") list.Sort((y, x) => string.Compare(x.PropertyName, y.PropertyName)); 
      if (e.SortExpression == "PropertyStreet") list.Sort((y, x) => string.Compare(x.PropertyStreet, y.PropertyStreet)); 
      if (e.SortExpression == "DisplayName") list.Sort((y, x) => string.Compare(x.DisplayName, y.DisplayName)); 
      if (e.SortExpression == "ZipCode") list.Sort((y, x) => string.Compare(x.ZipCode, y.ZipCode)); 
     } 

     ViewState["propertyManagersAndLeasingAgents"] = list; 

     this.grdPropMgrLeaseAgents.DataSource = list; 
     this.grdPropMgrLeaseAgents.DataBind(); 

     if (sortExpression == "A") 
     { 
      ViewState[e.SortExpression + "_sort"] = "D"; 
     } 
     else 
     { 
      ViewState[e.SortExpression + "_sort"] = "A"; 
     } 
    } 

답변

2

SPGridView를 사용해 보셨습니까? SPGridView와 LinqDataSource를 사용했습니다. 모든 기능 (분류, 페이징, 필터링)이 처리됩니다.

다음은 예입니다. - a. SpridView

<SharePoint:SPGridView runat="server" ID="spgvUserTrainingLists" AutoGenerateColumns="false" 
           DataSourceID="linqDsEmployeeTrainingLists" DataKeyNames="RowId" OnRowDataBound="spgvUserTrainingLists_RowDataBound" 
           AllowSorting="true" AllowPaging="true" PageSize="15" AllowFiltering="true" FilteredDataSourcePropertyName="Where" 
           FilteredDataSourcePropertyFormat='{1} == "{0}"' FilterDataFields=",TrainingType,,Trainer,Status"> 
           <Columns> 
            <SharePoint:SPBoundField HeaderText="Ref #" SortExpression="RefNo" DataField="RefNo" /> 
            <SharePoint:SPBoundField HeaderText="Type" SortExpression="TrainingType" DataField="TrainingType" /> 
            <asp:TemplateField HeaderText="Training" SortExpression="TrainingTitle"> 
             <ItemTemplate> 
              <asp:HyperLink ID="hlTrainingDetail" runat="server" Text='<%# Eval("TrainingTitle") %>' 
               NavigateUrl="#" /> 
             </ItemTemplate> 
            </asp:TemplateField> 
            <SharePoint:SPBoundField HeaderText="Trainer" SortExpression="Trainer" DataField="Trainer" /> 
            <SharePoint:SPBoundField HeaderText="Status" SortExpression="Status" DataField="Status" /> 
            <asp:TemplateField> 
             <ItemTemplate> 
              <asp:ImageButton ID="imgDelete" ImageUrl="~/_layouts/images/DELITEM.GIF" runat="server" 
               UseSubmitBehaviour="false" /> 
             </ItemTemplate> 
            </asp:TemplateField> 
           </Columns> 
           <EmptyDataTemplate> 
            No training yet. 
           </EmptyDataTemplate> 
          </SharePoint:SPGridView> 
          <SharePoint:SPGridViewPager ID="SPGridViewPager1" runat="server" GridViewId="spgvUserTrainingLists" /> 
          <aspweb:LinqDataSource runat="server" ID="linqDsEmployeeTrainingLists" OnSelecting="linqDs_Selecting" /> 

b. SPGridView 필터 기호

protected void spgvUserTrainingLists_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.Header) 
     { 
      if (!string.IsNullOrEmpty(spgvUserTrainingLists.FilterFieldName)) 
      { 
       for (int i = 0; i < spgvUserTrainingLists.Columns.Count; i++) 
       { 
        DataControlField field = spgvUserTrainingLists.Columns[i]; 

        if (field.SortExpression == spgvUserTrainingLists.FilterFieldName) 
        { 
         Image filterIcon = new Image(); 
         filterIcon.ImageUrl = "/_layouts/images/filter.gif"; 
         filterIcon.Style[HtmlTextWriterStyle.MarginLeft] = "2px"; 

         Literal headerText = new Literal(); 
         headerText.Text = field.HeaderText; 

         PlaceHolder panel = new PlaceHolder(); 
         panel.Controls.Add(headerText); 
         panel.Controls.Add(filterIcon); 

         e.Row.Cells[i].Controls[0].Controls.Add(panel); 

         break; 
        } 
       } 
      } 
     } 
    } 

c. LinqDataSource

protected void linqDs_Selecting(object sender, LinqDataSourceSelectEventArgs e) 
    { 
     object parameter = null; 

     if (e.SelectParameters.TryGetValue("employee", out parameter)) 
     { 
      e.Result = DefaultBLL.GetEmployeeTrainingLists(parameter.ToString()); 
     } 
    } 

SharePoint를 사용하고 있으므로 시도해보십시오. 희망이 도움이됩니다.

+0

코드 쉐어 포인트에서 데이터를 데이터 바인딩하기 때문에 셰어 포인트 그리드 뷰를 사용하는 것이 좋지만 똑같은 방식으로 작동하지는 않습니다. 그것을 시도했지만 데이터 소스를 제거 할 때, 나는 뒤에 코드에서 내 자신을 연결했고 _sorting 메서드를 기대했기 때문에 작동하지 않았다. 그 다음 나는 같은 장소에서 나 자신을 발견했다. –

+0

나는 코드 뒤에서도 데이터 바인딩을하고있다. linqDs_Selecting 이벤트를 살펴보십시오. 비즈니스 계층의 데이터를 바인딩하고 있습니다. LinqDataSource 컨트롤은 정렬, 페이징 및 필터링 만 처리합니다. 정말 사용하는 것이 좋습니다. 또 다른 방법은 SPGridView + ObjectDataSource + DataTable을 사용하는 것입니다. –

+0

더 이상 비즈니스 계층에서 실행하는 예제가 있습니까? –