0

ページに単純なグリッドビューを作成しています。データは sql プロシージャから取得されます。現在の様子は次のとおりです。

ここに画像の説明を入力

私の最初の質問は、「%」列のパーセンテージを計算する方法です。数式は非常に単純です: たとえば、選択したセルでは 15612/238171 * 100% である必要があります

私は次のようにすべての行の要約を計算しています:

<asp:TemplateField>
    <ItemTemplate>
        <asp:Label ID="sprawy" runat="server" Text='<%#Sprawy(Eval("sprawy"),1) %>' /> 
    </ItemTemplate>
    <FooterTemplate>
        <asp:Label ID="sumaSpraw" runat="server" Text='<%#GetSumaSpraw(1) %>' /> 
    </FooterTemplate>
</asp:TemplateField> 

これは、グリッドビューの列の私のコードです

そして、これは関数のコードです:

    public Int32[] SumaSpraw = new Int32[4];

    public Int32 Sprawy(object arg1, int i)
    {
        var ilosc = arg1 != DBNull.Value ? Convert.ToInt32(arg1) : 0;
        SumaSpraw[i - 1] += ilosc;
        return ilosc;
    }

    public Int32 GetSumaSpraw(int i)
    {
        return SumaSpraw[i - 1];
    }

1 つの行とセルの値から集計に基づいて「%」セルの値を計算する方法を知りたいです。

私の2番目の質問:グリッドビューのビューを変更して、次のようにグループでデータを表示することは可能ですか:

ここに画像の説明を入力

4

1 に答える 1

0

グリッドビューに2つのイベントリスナー、onRowDataBoundとonDataBoundを追加することで、最初の部分を実行できました。

これは、このメソッドに対する私のコードです。

    protected void GridViewOnRowDataBound(object sender, GridViewRowEventArgs e)
    {
        int i=0;
        if (sender == GridView1)
            i = 0;
        else if (sender == GridView2)
            i = 1;


        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            SumaSpraw[i] += Convert.ToInt32(((Label)e.Row.FindControl("sprawy")).Text);
            SumaAdresow[i] += Convert.ToInt32(((Label)e.Row.FindControl("adresy")).Text);
            SumaInPost[i] += Convert.ToInt32(((Label)e.Row.FindControl("inpost")).Text);
            SumaPoczta[i] += Convert.ToInt32(((Label)e.Row.FindControl("poczta")).Text);
        }
        if (e.Row.RowType == DataControlRowType.Footer)
        {
            ((Label)e.Row.FindControl("sumaSpraw")).Text = SumaSpraw[i].ToString("N0");
            ((Label)e.Row.FindControl("sumaAdresow")).Text = SumaAdresow[i].ToString("N0");
            ((Label)e.Row.FindControl("sumaInPost")).Text = SumaInPost[i].ToString("N0");
            ((Label)e.Row.FindControl("sumaPoczta")).Text = SumaPoczta[i].ToString("N0");
        }
    }

    protected void GridViewOnDataBound(object sender, EventArgs e)
    {
        int i = 0;
        if (sender == GridView1)
            i = 0;
        else if (sender == GridView2)
            i = 1;

        decimal percent = 0M;

        foreach (GridViewRow row in ((GridView)sender).Rows)
        {
            percent = (Convert.ToInt32(((Label)row.FindControl("adresy")).Text) / SumaAdresow[i]) * 100;
            ((Label)row.FindControl("procentAdresow")).Text = FormatPercent(Math.Round(percent, 2));

            percent = (Convert.ToInt32(((Label)row.FindControl("inpost")).Text) / SumaInPost[i]) * 100;
            ((Label)row.FindControl("procentInPost")).Text = FormatPercent(Math.Round(percent, 2));

            percent = (Convert.ToInt32(((Label)row.FindControl("poczta")).Text) / SumaPoczta[i]) * 100;
            ((Label)row.FindControl("procentPoczta")).Text = FormatPercent(Math.Round(percent, 2));
        }
    }

    protected string FormatPercent(decimal percent)
    {
        if (percent == decimal.Truncate(percent))
        {
            return percent.ToString("N0") + "%";
        }
        else if (percent * 10 == decimal.Truncate(percent * 10))
        {
            return percent.ToString("N1") + "%";
        }
        else if (percent*100 == decimal.Truncate(percent*100))
        {
            return percent.ToString("N2") + "%";
        }
        else
            return percent.ToString("N0") + "%";
    }

3番目の方法は、出力のフォーマットに使用されます。

しかし、それでも私は2番目の部分について疑問に思っています-2つの行から2つのセルだけをマージする方法(私の2番目の画面のように)。


スタイリング部分は完了しました。たぶんコードはそれほど素晴らしく見えませんが、それは機能します:)

    public static void GridViewRowMerger(GridView gridView, int collIndex)
    {
        for (int rowIndex = gridView.Rows.Count - 2; rowIndex >= 0; rowIndex--)
        {
            GridViewRow currentRow = gridView.Rows[rowIndex];
            GridViewRow previousRow = gridView.Rows[rowIndex + 1];

            if (currentRow.Cells[collIndex].Text != previousRow.Cells[collIndex].Text) continue;
            if (previousRow.Cells[collIndex].RowSpan < 2)
            {
                currentRow.Cells[collIndex].RowSpan = 2;
            }
            else
                currentRow.Cells[collIndex].RowSpan = previousRow.Cells[collIndex].RowSpan + 1;
            previousRow.Cells[collIndex].Visible = false;
        }
    }

    public static void GridViewRefreshStyle(GridView gridView, int collIndex)
    {
        int rows = 0;
        for (int rowIndex = 0; rowIndex < gridView.Rows.Count; rowIndex++)
        {
            if (gridView.Rows[rowIndex].Cells[collIndex].RowSpan > 1)
            {
                for (int i = 0; i < gridView.Rows[rowIndex].Cells[collIndex].RowSpan; i++)
                {
                    gridView.Rows[rowIndex + i].CssClass = rows%2 == 0
                                                               ? gridView.RowStyle.CssClass
                                                               : gridView.AlternatingRowStyle.CssClass;
                }
                rowIndex += gridView.Rows[rowIndex].Cells[collIndex].RowSpan - 1;
            }
            else
            {
                gridView.Rows[rowIndex].CssClass = rows%2 == 0
                                                       ? gridView.RowStyle.CssClass
                                                       : gridView.AlternatingRowStyle.CssClass;
            }
            rows++;
        }
    }

したがって、データをバインドした後、GridViewを実行します。これらの2つのメソッドを次のように呼び出します。

GridView2.DataSource = dSet.Tables[1];
GridView2.DataBind();
GridViewRowMerger(GridView2, 0);
GridViewRefreshStyle(GridView2, 0);
于 2012-04-27T06:09:13.930 に答える