1

私はいくつかの古いコード (私のものではない) に取り組んでいますが、残念ながら、ハードコードされたコードが多く含まれており、現在修正しようとしている問題を引き起こしています。ここに私の問題があります:

2 週間を表す 14 列のグリッドビューがあります。初日は、ユーザーの「タイプ」をチェックするコード内のブール値に応じて、月曜日または日曜日のいずれかになります。

現在、すべての日は次のようにレイアウトされています (これは日曜日の場合です)。

    <asp:TemplateField HeaderText="SUN">
        <footertemplate>
            <asp:Label ID="lblD1F" runat="server" ForeColor="white" Width="35px" Text="<%# GetTotal(0).ToString() %>" />
        </footertemplate>
        <headertemplate>
            <asp:Label ID="lblD1H" runat="server" CssClass="hdr_Day" Text="SUN"></asp:Label><br />
            <asp:Label ID="lblD1D" runat="server" CssClass="hdr_Date" Text='<%# _displayDate.ToString("MM/dd") %>'></asp:Label>                
        </headertemplate>
        <itemtemplate>
            <anthem:TextBox id="tbDay1" 
                            runat="server" 
                            Text='<%# Bind("Day1") %>'  
                            CssClass="tbWeekEnd" 
                            AutoCallBack="true" />
            <asp:Label ID="lblDay1" runat="server" Visible="false" Text='<%# Bind("Day1") %>'></asp:Label>

        </itemtemplate>
        <itemstyle cssclass="cell_weekend" />
    </asp:TemplateField>

したがって、上記のように 14 日間セットアップすると、次のようになります。

例

今、ユーザーに基づいて、日曜日または月曜日に開始するようにしようとしていました。私は古い文字列の上に新しい文字列をハードコーディングしましたが、これはより多くの問題を引き起こし始めています。まず、2 つの定数文字列を作成しました。

String[] userADays = new String[] { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" };
String[] userBDays = new String[] { "MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN" };

protected void gvMasterProjects_RowDataBound(object sender, GridViewRowEventArgs e)
{

    //This if/else statement overrides the hard coded date headers in the timeEntry aspx files since the days were hardcoded in.
    //Populates the cells w/ the data from one of two arrays depending if the user is A or B.
    if (e.Row.RowType == DataControlRowType.Header)
    {
        e.Row.CssClass = "HeaderStyle";
        if (isUserB == false)
        {
            for (int i = 9; i < 23; i++)
            {
                e.Row.Cells[i].Font.Size = 10;
                e.Row.Cells[i].Text = userADays[i - 9] + "\n" + " " + _displayDate.AddDays(i-9).ToString("MM/dd") + " ";

            }
        }

        else
        {
            for (int i = 9; i < 23; i++)
            {
                e.Row.Cells[i].Font.Size = 10;
                e.Row.Cells[i].Text = UserBDays[i - 9] + "\n" + " " + _displayDate.AddDays(i - 9).ToString("MM/dd") + " ";

            }
        }
    }

.aspx ファイルのグリッドビューは次のとおりです。

<anthem:GridView 
    ID="gvMasterProjects" 

    runat="server" 
    AutoGenerateColumns="false" 
    ShowFooter="true" 
    OnRowDataBound="gvMasterProjects_RowDataBound" 
    AllowPaging="false"
    EnableViewState="true" 
    HorizontalAlign="Center"
    AlternatingRowStyle-CssClass="AlternatingRowStyle" 
    RowStyle-CssClass="RowStyle" 
    HeaderStyle-CssClass="HeaderStyle" style="margin-left: 71px">

私は本当にこのハードコーディングをやめたいと思っています。現在行われていることを行わずに、これらの日付をロードする簡単な方法が必要です。どんな助けでも大歓迎です。

編集:以下の回答を試みましたが、実行される「UpdateAfterCallBack」行が多く、日付が.aspxのハードコードされた日付に戻されることを除いて機能します。.aspx でこれを行う簡単な方法はありますか?

4

2 に答える 2

1

ユーザーが希望するタイプの場合に開始日に 1 日を追加できるように、そこに「バッファー」日を入れることを検討しましたか?

これにより、デフォルトでは 0 で、特定のタイプのユーザーの場合は 1 のバッファが作成されます。これが追加され、日付が表示されます。

protected void gvMasterProjects_RowDataBound(object sender, GridViewRowEventArgs  e)
{
    //This if/else statement overrides the hard coded date headers in the timeEntry aspx files since the days were hardcoded in.
    //Populates the cells w/ the data from one of two arrays depending if the user is A or B.
    if (e.Row.RowType == DataControlRowType.Header)
    {
        e.Row.CssClass = "HeaderStyle";
        var bufferDay = 0; // Starts on sunday.
        if (isUserB)
        {
            bufferDay = 1; // Starts on Monday.
        }
        for (int i = 9; i < 23; i++)
        {
            e.Row.Cells[i].Font.Size = 10;
            var dayOfWeek = _displayDate.AddDays(i - 9 + bufferDay);
            e.Row.Cells[i].Text = dayOfWeek.ToString("ddd") + "\n" + " " + dayOfWeek.ToString("MM/dd") + " ";
        }        
    }
}

編集ごとに: .aspx を次のように編集して、提供された日付に基づいて日のテキストを取得するとどうなりますか? HeaderText の _displayDate への参照を追加する必要があるかどうかはわかりません (aspx をいじってからしばらく経ちました)。HeaderText でサブに呼び出すときにデータがバインドされるかどうかはわかりません。

  <asp:TemplateField HeaderText="SUN">
    <footertemplate>
        <asp:Label ID="lblD1F" runat="server" ForeColor="white" Width="35px" Text="<%# GetTotal(0).ToString() %>" />
    </footertemplate>
    <headertemplate>
        <asp:Label ID="lblD1H" runat="server" CssClass="hdr_Day" Text='<%# _displayDate.ToString("mmm") %>'></asp:Label><br />
        <asp:Label ID="lblD1D" runat="server" CssClass="hdr_Date" Text='<%# _displayDate.ToString("MM/dd") %>'></asp:Label>                
    </headertemplate>
    <itemtemplate>
        <anthem:TextBox id="tbDay1" 
                        runat="server" 
                        Text='<%# Bind("Day1") %>'  
                        CssClass="tbWeekEnd" 
                        AutoCallBack="true" />
        <asp:Label ID="lblDay1" runat="server" Visible="false" Text='<%# Bind("Day1") %>'></asp:Label>

    </itemtemplate>
    <itemstyle cssclass="cell_weekend" />
</asp:TemplateField>

個人的には、TemplateFields を自動化する方法を検討することさえあります。このスレッドの他の回答で言及されているようなクラスから作成できる、繰り返されるコードがたくさんあるようです。ただし、上記を試して、更新の問題が解決するかどうかを確認してください.

于 2015-12-21T19:46:12.650 に答える