0

これを行うには、よりクリーンで簡潔な方法が必要であることを私は知っています...しかし、私はそれをグーグルで試しているところはどこにもありません。基本的に、HTMLテーブルに書き込む必要のあるデータセットがあります。

テーブルは次のようになります(ただし、はるかに長くなります)。

            DOB SDLW SDLY WTD LWTD
開始日:2013年3月6日2013年2月27日2012年7月3日2013年4月3日2013年2月25日
終了日:2013年3月6日2013年2月27日
売上高5,661.474,876.8216.1%5,765.33 -1.8%13,941.10 13,310.09 4.7%
総売上高6,499.145,549.9417.1%6,602.71 -1.6%16,046.50 15,306.56 4.8%
ゲスト数369.00317.0016.4%392.00 -5.9%920.00 872.00 5.5%
合計コンプ187.29102.4682.8%163.19 4.8%499.74 455.82 9.6%
総ボイド56.2551.0510.2%131.65 -57.3%161.05 227.83 -29.3%

署名記事の問題:

もともと私はこれを使用して書いていましたが、それぞれHtmlTextWriterを呼び出さなければならないため、信じられないほどの量の(ノイズの多い)コードが作成されました。次にラッパーに移動したので、セルを1行のコードに減らすことができます。AddAttribute()<td>

    public string wrapAmntCell(Object input)
    {
        return "<td align=\"right\">" + string.Format("{0:n}", input) + "&nbsp;" + "</td>";
    }

私はまだ特に好きではありませんが、私は始めたところから少なくとも大幅に改善しました。でも...

全体像の問題:

+ =ステートメント(cringe)で作成された値の文字列を連結してこれらの行を作成しているということですか、次のようになります。

string[] finalNet = new string[validSites.Count];
string[] finalGross = new string[validSites.Count];
string[] finalGC = new string[validSites.Count];
string[] finalComp = new string[validSites.Count];
string[] finalVoid = new string[validSites.Count];

foreach (string num in validSites)
{
    //SDLY
    foreach (DataStore sdlyTmp in sdly)
    {
        if (sdlyTmp.siteNumber.Equals(num))
        {
            finalNet[countTD] += wrapAmntCell(sdlyTmp.netSales);
            finalGross[countTD] += wrapAmntCell(sdlyTmp.grossSales);
            finalGC[countTD] += wrapAmntCell(sdlyTmp.guestCount);
            finalComp[countTD] += wrapAmntCell(sdlyTmp.compTotal);
            finalVoid[countTD] += wrapAmntCell(sdlyTmp.voidTotal);

            tmpCol03[0] = sdlyTmp.netSales;
            tmpCol03[1] = sdlyTmp.grossSales;
            tmpCol03[2] = sdlyTmp.guestCount;
            tmpCol03[3] = sdlyTmp.compTotal;
            tmpCol03[4] = sdlyTmp.voidTotal;

            //percentage diff
            finalNet[countTD] += wrapPctCell(getPctDiff(tmpCol01[0], tmpCol03[0]));
            finalGross[countTD] += wrapPctCell(getPctDiff(tmpCol01[1], tmpCol03[1]));
            finalGC[countTD] += wrapPctCell(getPctDiff(tmpCol01[2], tmpCol03[2]));
            finalComp[countTD] += wrapPctCell(getPctDiff(tmpCol01[3], tmpCol03[3]));
            finalVoid[countTD] += wrapPctCell(getPctDiff(tmpCol01[4], tmpCol03[4]));
            //end diffs

            totalsCol03[0] += sdlyTmp.netSales;
            totalsCol03[1] += sdlyTmp.grossSales;
            totalsCol03[2] += sdlyTmp.guestCount;
            totalsCol03[3] += sdlyTmp.compTotal;
            totalsCol03[4] += sdlyTmp.voidTotal;
        }
    }
}

(これを書いていると、.NET 3.5の魔法を使って、内部のforeachとその中にネストされたifステートメントを組み合わせることができると思います。まだ学習中です。そのためのガイダンスもいただければ幸いです)

これらのCol配列がパーセント差分に使用される場合。

すべてのループの最後に、<tr>...</tr>(1行あたり19セルのデータ)からの完全な行を含む5つの配列が作成され、各サイトに再度ループバックします(情報が位置的に保存されるため、Store1のデータが配置されます)。 finalNet [0]、finalGross [0]などで)、それらをに書き込みますHtmlTextWriter

私の問題の一部は、実際のデータが垂直方向に保存されることです(1つの日付の完全な列を含むオブジェクトを使用します-これらの値は列ヘッダーの日付に基づいてSQLクエリから取得されます)-水平方向に出力する必要がありますテーブル。

ただし、このコードをクリーンアップしてテーブルの形式をそのまま維持する方法を理解するのに問題があります。どんな考えでも大歓迎です。

4

2 に答える 2

1

Razorなどのビュー エンジンを使用することをお勧めします。このプロジェクトはオープン ソースであり、ASP.Net ランタイムの外部で動作します。このようにして、プレゼンテーション (HTML テーブルの生成) をデータ生成から切り離すことができます。このようにして、次の行に沿ってコードを書くことができます。SQLクエリからのデータが列指向であり(提案したように)、という名前のコレクションであると仮定しますdata

実行可能ファイルの C# コード:

var data = ...;

var template = File.ReadAllText("path/to/razor/template.cshtml");
var html = Razor.Parse(template,data); //Bind the SQL data to the HTML

かみそりテンプレートの例:

<table>
    @foreach(var row in Model) {
        <tr>
            @foreach(var col in row) {
                <td>@col</td>
            }
        </tr>
    }
</table>

コードの詳細を知らなければ、より良い例を示すのは少し難しいですが、これは正しい方向に導くはずだと思います

于 2013-03-08T06:27:01.777 に答える
0

私は「レッドドッグ」に完全に同意します。gridview コントロールを使用し、Data オブジェクトをデータソースとして gridview に渡す必要があります。また、クライアント側のスクリプト作成に JQGrid を使用することもできます。

于 2013-03-08T05:21:32.513 に答える