0

私は今立ち往生しています。グリッドビューに動的に追加されたリンクボタンまたはラベルを維持しようとして何年も費やした後、ポストバック時にチェックボックスの状態を上書きしているようです。

述べたように、次のように、グリッドビューのプレースホルダーにリンクボタンまたはラベルを動的に追加しています。

protected void LedgerGrid_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            int index = e.Row.RowIndex;

            if (items[index].noteID > 0)
            {

                PlaceHolder label = (PlaceHolder)e.Row.FindControl("HasPrevious");
                LinkButton link = new LinkButton();
                link.CommandName = "LinkCommand";
                link.Command += new CommandEventHandler(link_Command);
                link.Text = "Yes";
                link.ID = index.ToString();
                label.Controls.Add(link);

            }
            else
            {
                PlaceHolder label = (PlaceHolder)e.Row.FindControl("HasPrevious");
                Label noNote = new Label();
                noNote.Text = "No";
                label.Controls.Add(noNote);
            }

グリッドビューは次のとおりです。

<asp:GridView runat="server" ID="LedgerGrid" AutoGenerateColumns="false" 
    onselectedindexchanged="LedgerGrid_SelectedIndexChanged" 
    onrowdatabound="LedgerGrid_RowDataBound" onrowcommand="LedgerGrid_RowCommand" 
    >
<Columns>
<asp:TemplateField HeaderText="Notes">
<ItemTemplate>
  <asp:PlaceHolder ID="HasPrevious" runat="server"></asp:PlaceHolder>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField HeaderText="Invoice Date" DataField="invoicedate" DataFormatString="{0:d}" />
<asp:BoundField HeaderText="Invoice" DataField="invoice" />
<asp:BoundField HeaderText="Fee Debt" DataField="Fee_Debt" DataFormatString="{0:C}" />
<asp:BoundField HeaderText="Cost Debt" DataField="Cost_Debt" DataFormatString="{0:C}" />
<asp:BoundField HeaderText="VAT Debt" DataField="VAT_Debt" DataFormatString="{0:C}" />
<asp:BoundField HeaderText="Total Debt" DataField="Total_Debt" DataFormatString="{0:C}" />
<asp:BoundField HeaderText="Client Code" DataField="ClientCode" />
<asp:ButtonField  HeaderText="Matter Number" DataTextField="matternumber" CommandName="ViewMatter" />
<asp:BoundField HeaderText="Decription" DataField="matterdescription" />
<asp:TemplateField>
<ItemTemplate>
<asp:CheckBox ID="AddInvoiceCheck" runat="server" Enabled="true" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>

リンク ボタン コマンドが機能することを確認するために、Page_load の場合と同様にグリッドビューを再構築しています。ページの読み込みは次のとおりです。

 protected void Page_Load(object sender, EventArgs e)
    {

        if (!IsPostBack)
        {

            string clientCode = Server.HtmlEncode(Request.QueryString["clientcode"]);
            items = DataAccess.DataAccess.GetLedgerDetails(clientCode);
            ViewState["LedgerItems"] = items;
            ViewState["clientcode"] = clientCode;
            LedgerGrid.DataSource = items;
            LedgerGrid.DataBind();
            LedgerClientObject clientDetails = DataAccess.DataAccess.GetClientDetails(clientCode);
            ClientCodeLabel.Text = string.Format("Group Code: {0}", clientDetails.GroupCode);
            ClientNameLabel.Text = string.Format("Client Name: {0}", clientDetails.ClientName);
            ClientCodeFilter.DataSource = clientDetails.ClientCodes;
            ClientCodeFilter.DataBind();


        }
    } 

ポストバックで動的に追加されたコントロールを維持するために、次のように呼び出しています。

protected void Page_PreLoad(object sender, EventArgs e)
    {


        if (IsPostBack)
        {
            items = (List<LedgerItem>)ViewState["LedgerItems"];
            LedgerGrid.DataSource = items;
            LedgerGrid.DataBind();


        }


    }

もちろん、このメソッドを使用することで、チェックボックスのグリッドビュー列の状態を上書きしているようです。私はこれにすべて間違って近づいていますか?ビューステートを使用して、動的に追加されたコントロールの設定をグリッドビューに維持できるようにしたいと考えています。PreLoad イベントでグリッドビューをリロードする前後に、チェックボックス コントロール フォーム グリッドビューの状態にアクセスする方法はありますか?

次のように、ボタンをクリックしてチェックボックス列の状態を確認しています。

        protected void Unnamed1_Click(object sender, EventArgs e)
    {
        NoteModel note = new NoteModel();
        for (int i = 0; i < LedgerGrid.Rows.Count; i++)
        {
            int invoice = Convert.ToInt32(LedgerGrid.Rows[i].Cells[2].Text);
            CheckBox check = (CheckBox)LedgerGrid.Rows[i].FindControl("AddInvoiceCheck");
            if (check.Checked)
            {
                note.invoices.Add(invoice);

            }



        }

        if (note.invoices == null)
        {

            string clientcode = (string)ViewState["clientcode"];
            ViewState["InvoiceError"] = 1;
            Response.Redirect(string.Format("Ledger.aspx?clientcode={0}", clientcode));
        }
        else
        {
            string clientcode = (string)ViewState["clientcode"];
            Session["NoteObject"] = note;
            Response.Redirect(string.Format("AddNote.aspx?cc={0}", clientcode));

        }


    }

グリッドビューでチェックボックス コントロールを反復処理するたびに、それらはすべてチェックされません。たとえば、PreLoad コードによって上書きされます!!!

4

1 に答える 1

1

最終的に、動的に作成されたコントロールを使用しないことにしました。代わりに、グリッド ビューにボタンフィールドを追加しました。私のrowdataboundイベントでは、ボタンが基準を満たしている場合は、ボタンの可視性をfalseに設定します。このようにして、ポストバックでコントロールを作成する必要がないため、ビューステートが維持されます。

可能な場合は動的コントロールを避けることが最善の策である Web フォームのようです。ビューステートの復元コントロールをオーバーライドするために利用するイベントを知りたいですか?

于 2012-10-19T10:34:55.267 に答える