簡體   English   中英

通過FindControl找不到動態生成的控件

[英]Dynamically generated controls not being found via FindControl

我有一個asp:panel ,單擊按鈕時,會動態添加一些復選框。

在另一個按鈕上單擊,我需要查看這些復選框並檢查是否已選中。

我找不到控件。 我嘗試使用提供的ID和ClientID進行FindControl。

復選框所在的面板的標記,以及兩個按鈕:

<asp:Panel runat="server" ScrollBars="Vertical" ID="pnlEmailCheckboxes" Height="150">
    <br/>
    <asp:CheckBox runat="server" Text="Other" ID="cbOtherEmail"/>
    <asp:TextBox ID="txtOtherEmail" runat="server" Style="width: 270px;" CssClass="textbox-default"></asp:TextBox>
    <br/>
</asp:Panel>
<asp:LinkButton ID="btnSendEmail" Text="<span>Send Email</span>" runat="server" CssClass="page-footer-button-highlight" OnClick="btnSendEmail_Click"></asp:LinkButton>
<asp:LinkButton ID="btnCloseEmail" Text="<span>Close</span>" runat="server" CssClass="page-footer-button" CausesValidation="false" OnClick="btnCloseEmail_OnClick"></asp:LinkButton>

生成文本框的事件:

protected void btnEmail_Click(object sender, EventArgs e)
{
    List<CheckBox> cbList = new List<CheckBox>();
    for (int i = 0; i < 10; i++)
    {
        CheckBox cb = new CheckBox();
        cb.Text = "text" + i;
        cb.ID = Guid.newGuid().ToString();
        cb.ClientIDMode = ClientIDMode.Static;
        pnlEmailCheckboxes.Controls.AddAt(0, cb);
        pnlEmailCheckboxes.Controls.AddAt(0, new LiteralControl("<br/>"));
        cbList.Add(cb);
    }

    Session["checkboxes"] = cbList;
    mpeEmail.Show();
}

嘗試檢索文本框的按鈕(不起作用):

protected void btnSendEmail_Click(object sender, EventArgs e)
{
    //the email recipients
    List<string> emailRecipients = new List<string>();

    List<CheckBox> cbList = (List<CheckBox>)Session["checkboxes"];

    foreach (CheckBox cb in cbList)
    {
        CheckBox cbClient = (CheckBox) pnlEmailCheckboxes.FindControl(cb.ClientID); //I've also tried to find it by cb.ID
        //null reference here, the checkbox cbClient was not found
        if (cbClient.Checked) emailRecipients.Add(cb.Text.Trim());
    }

    //Ive also tried this, it does not contain the dynamically generated checkboxes
    //var cbControls = pnlEmailCheckboxes.Controls.OfType<CheckBox>();
}

編輯:

客戶端html甚至顯示,其ID與我要搜索的ID匹配。

<input id="00e3a485-2083-4ef8-810b-6ed4fb1f62f9" type="checkbox" name="ctl00$Body$00e3a485-2083-4ef8-810b-6ed4fb1f62f9">

嘗試向每個動態控件添加唯一的ID並設置ClientIDMode = ClientIDMode.Static

 List<CheckBox> cbList = new List<CheckBox>();
 for (int i = 0; i < 10; i++)
 {
    CheckBox cb = new CheckBox();
    cb.ID = "DynamicCb" + i";
    cb.ClientIDMode = ClientIDMode.Static;
    cb.Text = "text" + i;
    pnlEmailCheckboxes.Controls.AddAt(0, cb);
    pnlEmailCheckboxes.Controls.AddAt(0, new LiteralControl("<br/>"));
    cbList.Add(cb);
 }

我已經找到解決問題的方法。 如果將控件添加到OnInit方法中,則可以看到稍后單擊按鈕的復選框。

protected override void OnInit(EventArgs e)
{
    List<CheckBox> cbList = new List<CheckBox>();
    for (int i = 0; i < 10; i++)
    {
        CheckBox cb = new CheckBox();
        cb.Text = "text" + i;
        cb.ID = Guid.newGuid().ToString();
        pnlEmailCheckboxes.Controls.AddAt(0, cb);
        pnlEmailCheckboxes.Controls.AddAt(0, new LiteralControl("<br/>"));
        cbList.Add(cb);
    }

    Session["checkboxes"] = cbList;
}

現在存在另一個問題,即使在UI上選中了每個復選框,每個復選框也始終具有Checked == False。 但是,這是另一個問題的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM