2016-06-14 12 views
1

私の問題は、stackoverflowのearlier questionに関連しています。 私の以前の質問では、c#asp.net Gridview Controlで同じ値の列をマージする必要がありました。この問題は、しかし、私はまた、行レベルの例えば上の順序を並べ替えるために必要だ、他のstackoverflowersから優れたヘルプとサポートで解決されました:行レベルに基づいてasp.net gridviewコントロールを並べ替えるC#

現在の形式: enter image description here

GridViewコントロールは私がすることができます列を並べ替える方法はありますが(行のレベルを左から右へ)、(現在の形式の)スクリーンショットを見て行3を確認すると、 (3x2a、2x2c)のようにまとめるのが理想ですが、これが正しい方法であるかどうかはわかりませんが、列全体をシフトする必要があります。想像できる最初の行を正しくソートして2番目の行に移動すると、最初の行の結果が再び乱れることがあります。

私は次のようにデータを表示する私のGridViewコントロールを持っているしたいと思います:

必要な形式: enter image description here

  1. これはasp.net GridViewコントロールのアプローチや達成可能だろうか?
  2. 私は他の方法で理想的なソリューションをどのように実現できますか?

追加情報が必要な場合は質問してください。私は質問を拡大しようとします。

更新された情報は:

ConnersFanの提案した後、私はアイデアが一種のあり、以下の結果を得た、しかしかなりまだ。

各スクリーンショットの後、私はこのスクリーンショットを取得するページを実行した後、私は何が起こるかを説明します:

enter image description here ^^^ デフォルトのページLOAD:これは、行のセルに/グループ等しい値をマージしを一緒に。

enter image description here ^^^ 最初の行をクリックする「ソート」リンク、最初の行が正しい見える後、列ヘッダーと値はすべて正しい場所に移動しています。

enter image description here ^^^ 第二列「ソート」リンクをクリックした後、それは正確に二行をソートし、をクリックした後、最初の行

enter image description here ^^^ をめちゃめちゃにしていません3行目の「ソート」リンクは、1行目と2行目を混乱させますが、3行目をマージしてグループ化することができます。

enter image description here

^^^ 4行目「ソート」リンクをクリックした後、それは、第一、第二及び第三の行を台無しにするが、OK第4行をマージし、グループに管理。

enter image description here

^^^ それらは全て同じ等しい値であるように違いを生じることはないはずである5行目「ソート」リンク、(上でクリックした後、それは、第1、第2、第3および第4行を台無ししかし、マージするために管理し、グループ5行目まだ大丈夫。

enter image description here ^^^ を、彼らはすべての異なる値がそうであるように違いを作るべきではありません6行目「ソート」リンク、(上でクリックした後、それを

私が好きなもの表示するには、ボタンでこれらを並べ替える必要はありませんが、すべての行が正しくマージされ、グループ化されています。前の行を上書きせずに、必要な形式のスクリーンショットで正しく終了する必要があります列の順序は、行セルの値が等しい場合はその値で決まります。

皆さんありがとうございます、あなたは私を大きく助けてくれました。

+0

これは正しいです:GridViewのグループ化ロジックを使用して適切にグループ化できるように行をソートする必要がありますか? – fnostro

+0

こんにちはfnostro、私は確かに何を探していますが、私の理想的なソリューションは、デフォルトで/レンダリング(ConnorsFanソリューションの '並べ替え'ボタンをクリックせずに)すべての行がソートされ、私の頭の中では、row1をソートする(等しい値がマージされ、列が再配置される)のと同じようになります。次にrow2(等価の値がマージされ、列が再配置されます。テーブル)は、最終的に "必要なフォーマット"のように見えるようになります。 – user6450463

+0

私は必要なフォーマットを理解していません。その画像内で行3のみがソートされます。 – ConnorsFan

答えて

1

あなたの質問を正しく理解していれば、通常のsortコマンドを転記して、列の順序に従って行を並べ替えるのではなく、行の順序に従ってGridView列を並べ替えるようにします。

あなたが(私は結合式のテキストを設定するために代わりにButtonFieldのTemplateFieldを使用)特定の行に並べ替えをトリガするために最初の列内のLinkBut​​tonを挿入することができますで

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="true" 
    OnRowCommand="GridView1_RowCommand" OnPreRender="GridView1_PreRender"> 
    <Columns> 
     <asp:TemplateField> 
      <ItemTemplate> 
       <asp:LinkButton runat="server" Text='<%# "Row " + ((Container as GridViewRow).RowIndex + 1) %>' CommandName="SortRow" CommandArgument='<%# (Container as GridViewRow).RowIndex %>' /> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

をコードビハインド、あなたは、グリッドの左側の固定列の数、およびRowCommandイベントハンドラに設定されているsortRowIndex変数を定義することができます、

private const int fixedColumnCount = 1; // Row number column 
private int sortRowIndex = -1; 

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) 
{ 
    if (e.CommandName == "SortRow") 
    { 
     sortRowIndex = Convert.ToInt32(e.CommandArgument); 
     // Here set the data source and bind the data to the GridView 
     GridView1.DataSource = ... 
     GridView1.DataBind(); 
    } 
} 

ソート自体がデータソースで実行することができスーあなたの前の投稿でfnostroによってggestedされています。私はデータがどのように見えるかわからないので、グリッドでそれを行う方法があります。

この作業は、GridViewのPreRenderまたはDataBoundイベントで実行できます。 your other postで指定された同じ内容のセルをグループ化するコードは、このイベントハンドラでも移動し、並べ替え操作の後に配置する必要があります。

protected void GridView1_PreRender(object sender, EventArgs e) 
{ 
    List<int> sortedColIndexes = null; 

    if (sortRowIndex >= 0) 
    { 
     // Gather the cell data on the sorted row... 
     List<KeyValuePair<string, int>> cellsToSort = new List<KeyValuePair<string, int>>(); 
     sortedColIndexes = new List<int>(); 

     GridViewRow sortedRow = GridView1.Rows[sortRowIndex]; 
     for (int i = fixedColumnCount; i < sortedRow.Cells.Count; i++) 
     { 
      TableCell cell = sortedRow.Cells[i]; 
      cellsToSort.Add(new KeyValuePair<string, int>(cell.Text, i)); 
     } 

     // ... and sort the cell indexes according to the cell content 
     sortedColIndexes = cellsToSort.OrderBy(x => x.Key).Select(x => x.Value).ToList(); 
    } 

    RearrangeRowCells(GridView1.HeaderRow, sortedColIndexes); 

    foreach (GridViewRow row in GridView1.Rows) 
    { 
     RearrangeRowCells(row, sortedColIndexes); 

     // The code below is taken from the other post 
     // It merges the cells with the same content 
     for (int i = 0; i < row.Cells.Count - 1; i++) 
     { 
      TableCell cell = row.Cells[i]; 

      if (cell.Visible) 
      { 
       int colSpanValue = 1; 

       for (int j = i + 1; j < row.Cells.Count; j++) 
       { 
        TableCell otherCell = row.Cells[j]; 

        if (otherCell.Text == cell.Text) 
        { 
         colSpanValue++; 
         otherCell.Visible = false; 
        } 
        else 
        { 
         break; 
        } 
       } 

       if (colSpanValue > 1) 
       { 
        cell.ColumnSpan = colSpanValue; 
        cell.BackColor = System.Drawing.Color.Beige; 
        cell.HorizontalAlign = HorizontalAlign.Center; 
       } 
      } 
     } 
    } 
} 

// Utility function which performs the cell permutations on a given row 
private void RearrangeRowCells(GridViewRow row, List<int> sortedColIndexes) 
{ 
    if (sortedColIndexes != null) 
    { 
     List<TableCell> sortedCells = new List<TableCell>(); 

     foreach (int cellIndex in sortedColIndexes) 
     { 
      sortedCells.Add(row.Cells[cellIndex]); 
     } 

     for (int i = fixedColumnCount; i < sortedCells.Count - 1; i++) 
     { 
      row.Cells.Remove(sortedCells[i]); 
      row.Cells.AddAt(i + fixedColumnCount, sortedCells[i]); 
     } 
    } 
} 
+0

こんにちはConnersFan、これは私が実際に探しているものですが、私の理想的な解決策は、デフォルトでは/レンダリング( 'ソート'ボタンをクリックせずに)すべての行がソートされ、私の頭の中では、row1(等価の値がマージされ、列が再配置されている)、次にrow2(等しい値がマージされ、列が再配置されています。テーブルを最終的に "必要なフォーマット"のように見えるようにします。 – user6450463

+0

したがって、他の行に影響を与えずに各行をソートする必要がありますか? 「必須フォーマット」のイメージでは、行3のみがソートされています。ヘッダを含む他の行は、行3で設定された条件に適合しているようです。上記のコードサンプルでは、​​コードを 'RowDataBound'イベントに移動することで、行を処理できます。 – ConnorsFan

+0

こんにちはConnersFan、あなたの助けていただきありがとうございます、私は更新muのオリジナルの質問があります。 – user6450463

関連する問題