5

2 つの子グリッドを呼び出す親グリッドがあります。しかし、なんらかの理由で、彼らは 2 回解雇されています。このコードの問題を本当に理解していないようです。誰でも私を案内できますか?

バックエンド コード (C#):

protected void grdGrpPrntRpt_RowDataBound(object sender,
                                      GridViewRowEventArgs e)
{
    try
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            TextBox litGrp = (TextBox)e.Row.FindControl("litGrp");
            litGrp.Text =
              DataBinder.Eval(e.Row.DataItem, "GroupName").ToString();
            ViewState["GroupName"] = litGrp.Text;
            DataSet ds = (DataSet)ViewState["ds"];
            DataView dv = ds.Tables[3].DefaultView;
            dv.RowFilter = "GroupName='" + litGrp.Text + "'";
            DataTable dt = dv.ToTable();
            GridView gvinner = (GridView)e.Row.FindControl("grdInnerMain");
            gvinner.DataSource = dt;
            gvinner.DataBind();
        }
    }
    catch (Exception Ex)
    {
        //report error
    }
}


protected void grdInnerMain_RowDataBound(object sender,
                                      GridViewRowEventArgs e)
{
    try
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            TextBox litUsr = (TextBox)e.Row.FindControl("litUsr");
            litUsr.Text = 
                DataBinder.Eval(e.Row.DataItem, "FirstName").ToString();
            // string username=
            DataSet ds = (DataSet)ViewState["ds"];
            DataView dv = ds.Tables[3].DefaultView;
            dv.RowFilter = "userName='" +
           DataBinder.Eval(e.Row.DataItem, "UserName").ToString().Replace("'",
               "''") + "' and GroupName='" + ViewState["GroupName"].ToString()
             + "'";
            DataTable dt = dv.ToTable();
            totalPages = 0;
            totalCost = 0;
            GridView gvinner2 = (GridView)e.Row.FindControl("innerGrid");
            gvinner2.DataSource = dt;
            gvinner2.DataBind();
        }
    }

    catch (Exception Ex)
    {
        //report error
    }

}
protected void innerGrid_RowDataBound(object sender,
                              GridViewRowEventArgs e)
{
    try
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            DataView dv = 
                ((DataSet)ViewState["dspaper"]).Tables[0].DefaultView;
            dv.RowFilter = "paperid=" +
               Convert.ToInt32(DataBinder.Eval(e.Row.DataItem,
                                         "paperid").ToString());
            DataTable dt = dv.ToTable();
            e.Row.Cells[0].Text = dt.Rows[0]["PaperName"].ToString();
            //  e.Row.Cells[2].Text = DataBinder.Eval(e.Row.DataItem, 
     "TotalPagesPrinted").ToString() == "0" ? DataBinder.Eval(e.Row.DataItem, 
       "TotalPagesSent").ToString() : DataBinder.Eval(e.Row.DataItem, 
       "TotalPagesPrinted").ToString();
            e.Row.Cells[2].Text = DataBinder.Eval(e.Row.DataItem, 
       "TotalPage").ToString() == "0" ? DataBinder.Eval(e.Row.DataItem, 
       "Pages_Sent").ToString() : DataBinder.Eval(e.Row.DataItem,
               "TotalPage").ToString();
            // e.Row.Cells[3].Text = 
        Convert.ToDouble(e.Row.Cells[3].Text.ToString()).ToString("0.00");
            totalPages += Convert.ToInt32(e.Row.Cells[2].Text.ToString());
            totalCost += Convert.ToDouble(e.Row.Cells[3].Text.ToString());
            e.Row.Cells[1].Text = DataBinder.Eval(e.Row.DataItem,
                   "Color").ToString() == "0" ? "B & W" : "Color";
        }
        if (e.Row.RowType == DataControlRowType.Footer)
        {
            e.Row.Cells[2].Text = totalPages.ToString();
            e.Row.Cells[3].Text = totalCost.ToString("0.00");
        }
        if (e.Row.RowType == DataControlRowType.Header)
        {
            e.Row.Cells[0].Text = 
                  CResourcesManager.GetString("grdHeaderMediaReport");
            e.Row.Cells[1].Text =
                  CResourcesManager.GetString("grdHeaderColorReport");
            e.Row.Cells[2].Text =
                  CResourcesManager.GetString("grdHeaderPagesReport"); ;
            e.Row.Cells[3].Text = 
                CResourcesManager.GetString("grdHeaderTotalCostReport");
        }
    }
    catch
    { }
}

フロントエンド コード:

<asp:GridView Width="100%" ID="grdGrpPrntRpt" runat="server" 
               AutoGenerateColumns="False"
                    CellPadding="0" CellSpacing="2" BorderWidth="0px" 
             ShowHeader="false" RowStyle-HorizontalAlign="Left"
                    OnRowDataBound="grdGrpPrntRpt_RowDataBound">

                    <Columns>
                        <asp:TemplateField>
                            <ItemTemplate>
                                <table id="tblInnerHeader" runat="server"
                                 width="100%" cellspacing="0" cellpadding="0">
                                    <tr bgcolor="gray" valign="top">
                                        <td width="20%" height="30px">
                                            &nbsp;
                                            <asp:TextBox ID="litGrp"
                           ForeColor="White" BackColor="Gray" CssClass="LabelText2"
                                                runat="server" BorderStyle="None" 
                                                   BorderWidth="0"></asp:TextBox>
                                        </td>
                                        <td width="2%">
                                        </td>
                                        <td width="78%" align="left">
                                            <asp:ImageButton ID="imgMainShowHide" 
                                    runat="server" ImageUrl="~/Images/plus.jpg"
                                                OnClick="imgMainShowHide_Click" />
                                        </td>
                                    </tr>
                                </table>
                                <table id="tblFirstInnerGrid" runat="server" 
                             visible="false" width="100%" cellspacing="2"
                                    cellpadding="0">
                                    <tr>
                                        <td align="center">
                                            <asp:GridView Width="100%" 
               ID="grdInnerMain" runat="server" AutoGenerateColumns="False"
                                                CellPadding="0" CellSpacing="2" 
              BorderWidth="0px" ShowHeader="false" RowStyle-HorizontalAlign="Left"

                        OnRowDataBound="grdInnerMain_RowDataBound">
                                                <Columns>
                                                    <asp:TemplateField>
                                                        <ItemTemplate>
                                                            <table id="tblHeader"
                  runat="server" width="100%" cellspacing="0" cellpadding="0">
                                                                <tr bgcolor="Wheat" 
                                                               valign="top">
                                                                    <td width="20%" 
                                                              height="25px">
                                                                        &nbsp;
                                                                        <asp:TextBox 
              ID="litUsr" ForeColor="Blue" BackColor="Wheat" CssClass="LabelText2"

              runat="server" BorderStyle="None" BorderWidth="0"></asp:TextBox>
                                                                    </td>
                                                                    <td width="2%">
                                                                    </td>
                                                                    <td width="78%" 
                                                                      align="left">
                                                                        <asp:ImageButton ID="imgShowHide" runat="server" ImageUrl="~/Images/plus.jpg"
                                               OnClick="imgShowHide_Click" />
                                                                    </td>
                                                                </tr>
                                                            </table>
                                                            <table id="tblInnerGrid" 
                          runat="server" visible="false" width="100%" cellspacing="2"
                                                                cellpadding="0">
                                                                <tr>
                                                                   <td align="center">
                                                                        <asp:GridView 
           ID="innerGrid" runat="server" AutoGenerateColumns="False" CellPadding="0"

       CellSpacing="2" HeaderStyle-CssClass="GridHeaderNoSorting" BorderWidth="0px"

          ShowFooter="true" RowStyle-HorizontalAlign="Left" Width="98%" 
                    OnRowDataBound="innerGrid_RowDataBound">
                                                                            <Columns>
                                                                                <asp:TemplateField>
                                                                                    <ItemTemplate>
                                                                                        <%-- <asp:Label ID="lblMedia" runat="server"></asp:Label>--%>
                                                                                    </ItemTemplate>
                                                                                </asp:TemplateField>
                                                                                <%--<asp:BoundField DataField="Color" HeaderText="Color/ B & W" /> --%>
                                                                                <asp:TemplateField HeaderText="Color/ B & W">
                                                                                    <ItemTemplate>
                                                                                        <%--   <asp:Label ID="lblColor" runat="server" Text='<%# DataBinder.Eval(Container.DataItem,"Color").ToString()=="0" ? "B & W" :"Color" %>'></asp:Label>--%>
                                                                                    </ItemTemplate>
                                                                                </asp:TemplateField>
                                                                                <%--<asp:BoundField DataField="TotalPagesPrinted" ItemStyle-HorizontalAlign="Center" />--%>
                                                                                <asp:TemplateField ItemStyle-HorizontalAlign="Center" HeaderStyle-HorizontalAlign="Center"
                                                                                    FooterStyle-HorizontalAlign="Center">
                                                                                    <ItemTemplate>
                                                                                        <%--<asp:Label ID="lblPagesPrinted" runat="server" Text='<%# DataBinder.Eval(Container.DataItem,"Color").ToString()=="0" ? "B & W" :"Color" %>'></asp:Label>--%>
                                                                                    </ItemTemplate>
                                                                                </asp:TemplateField>
                                                                                <asp:BoundField DataField="Total_Cost" ItemStyle-HorizontalAlign="Center" HeaderStyle-HorizontalAlign="Center"
                                                                                    FooterStyle-HorizontalAlign="Center" />
                                                                            </Columns>
                                                                            <HeaderStyle CssClass="GridHeaderNoSorting" />
                                                                            <AlternatingRowStyle CssClass="GridAlternateRowStyle" />
                                                                            <RowStyle CssClass="GridRowStyle" />
                                                                            <FooterStyle CssClass="GridFooter" HorizontalAlign="Left" />
                                                                        </asp:GridView>
                                                                    </td>
                                                                </tr>
                                                            </table>
                                                        </ItemTemplate>
                                                    </asp:TemplateField>
                                                </Columns>
                                                <AlternatingRowStyle CssClass="GridAlternateRowStyle" />
                                                <RowStyle CssClass="GridRowStyle" />
                                            </asp:GridView>
                                        </td>
                                    </tr>
                                </table>
                            </ItemTemplate>
                        </asp:TemplateField>
                    </Columns>
                    <AlternatingRowStyle CssClass="GridAlternateRowStyle" />
                    <RowStyle CssClass="GridRowStyle" />
                </asp:GridView>

追加情報

何らかの理由grdGrpPrntRpt_RowDataBoundで、次のグリッドにデータが存在する回数だけイベントが呼び出されます。次の 2 つのグリッドのデータ全体がバインドされるとすぐに終了する必要がありますが、再度呼び出して、プロセス全体をもう一度繰り返します。

4

7 に答える 7

3

が原因である可能性がAutoEventWireUpあります。あなたのコードではそうかもしれません。もしそうなら、それを偽にしてください。ありがとう

于 2013-10-25T04:39:51.533 に答える
1

GridView を他のイベント (Page_Load など) にバインドしているかどうかを確認してください。Page_Load で GridView をバインドする場合は、次のようにしてください。

if (!Page.IsPostBack)
{

//bind your GridView
}
于 2013-10-16T06:05:48.253 に答える
1

この問題は単に、どういうわけか grdGrpPrntRpt.DataBind() を 2 回呼び出していることを意味するはずです。

ネストされたグリッドビューのデータバインディングの実装は正しいように見えるので、問題

メイングリッドをデータバインドしているイベントにある可能性があります。

メイン グリッドの DataBind のすべての行にコメントを付けて、Page_Load に一度入れてみてください。

イベントが発生すると、別の問題が発生する可能性がありますが、解決策に近づくことができます.

于 2013-10-19T03:16:52.223 に答える
0

グリッドの RowDataBound は、グリッドに存在する行数の回数発生します。

親グリッドに複数のレコードがあるかどうかを確認してください..

于 2013-10-25T05:35:22.283 に答える
0

Always check where all you binding grid or call gridbinding function. Like:-

you might have call it on Page_Load to bind first time then you would have call it at imgMainShowHide_Click event to bind it to new values. hence binding grid two time, so make sure to bind only when !Ispostback on Page_Load and enable gridview viewstate to retain its state during postback.

于 2013-10-24T06:51:10.563 に答える
0

指定されたバックエンド コードとフロントエンド コードに問題はありません。このリンクを参照してください。

于 2013-10-24T21:28:13.380 に答える