C# asp.net可以';在div中找不到从代码隐藏添加的控件

C# asp.net可以';在div中找不到从代码隐藏添加的控件,c#,asp.net,html,code-behind,C#,Asp.net,Html,Code Behind,我正在尝试访问div中的控件,但找不到它们 我有一个有控制装置的潜水舱 <div id="divChampsFiltrageProjetsTest" class="divChampsFiltrageProjetsTest" runat="server"> <span runat="server" style="color:black;"> Filtre 1 : </span> <asp:DropDownList ID="ddlFiltrePro

我正在尝试访问div中的控件,但找不到它们

我有一个有控制装置的潜水舱

<div id="divChampsFiltrageProjetsTest" class="divChampsFiltrageProjetsTest" runat="server">

  <span runat="server" style="color:black;"> Filtre 1 : </span>
  <asp:DropDownList ID="ddlFiltreProjets1" runat="server" ForeColor="Black" >
    <asp:ListItem Value="no" Selected="True">No. Projet</asp:ListItem>
    <asp:ListItem Value="desi">Designation Projet</asp:ListItem>
    <asp:ListItem Value="chef">Chef de Projet</asp:ListItem>
  </asp:DropDownList>

  <asp:TextBox ID="txtValeurFiltreProjets1" runat="server" ForeColor="Black" />

  <asp:Button ID="btnAddFiltre1" runat="server" Text="Ok" OnClick="btnAppliquerFiltreProjets_Click"/>

</div>
这部分代码将控件添加到div中,当我获得该页面时,控件位于源代码中


过滤器1:
不,Projet
指定项目
普罗杰特厨师长
过滤器2:
不,Projet
Dé;签名项目
普罗杰斯厨师长
但是,当我试图从后面的代码中获取我添加的控件时,它表示该值为null

    for (int i = 1; i < Convert.ToInt32(Session["nbFiltres"].ToString()) + 1; i++)
    {

        DropDownList ddl = (DropDownList)divChampsFiltrageProjetsTest.FindControl("ddlFiltreProjets"+i.ToString());
        TextBox txt = (TextBox)divChampsFiltrageProjetsTest.FindControl("txtValeurFiltreProjets" +i.ToString());

        Session["typeFiltreProjets" + i.ToString()] = ddl.SelectedValue.ToString();
        Session["valeurFiltreProjets" + i.ToString()] = txt.Text;
    }
for(int i=1;i
此部分位于按钮的“单击事件”功能中

所以我的问题是,我从代码隐藏添加的控件实际上不在div中


有人知道为什么吗?

divchampsfiltrageprojectstest.Controls[3*i]看起来不对劲也许你应该试试FindControl

for (int i = 1; i < Convert.ToInt32(Session["nbFiltres"].ToString()) + 1; i++)
    {

        DropDownList ddl = (DropDownList)divChampsFiltrageProjetsTest.FindControl("ddlFiltreProjets" + (i + 3 * i).ToString());
        TextBox txt = (TextBox)divChampsFiltrageProjetsTest.FindControl("txtValeurFiltreProjets" + (5 * i).toString());

        Session["typeFiltreProjets" + i.ToString()] = ddl.SelectedValue.ToString();
        Session["valeurFiltreProjets" + i.ToString()] = txt.Text;
    }
声明为Page类中的字段,然后在页面加载时添加这些字段,前提是页面未回发

public override void OnLoad(../*cant' remember the parameters*/){
    if(!Page.IsPostBack){
       span.Style.Add(HtmlTextWriterStyle.Color, "Black");

        span.InnerText = "Filtre " + (i + 1).ToString() + " : ";

        ddlList.ID = "ddlFiltreProjets" + (i + 1).ToString();
        ddlList.Items.Add(item1);
        ddlList.Items.Add(item2);
        ddlList.Items.Add(item3);

        txtValeur.ID = "txtValeurFiltreProjets" + (i + 1).ToString();
        txtValeur.ForeColor = System.Drawing.Color.Black;

        btnAdd = btnAddFiltre1;

        divChampsFiltrageProjetsTest.Controls.Add(span);
        divChampsFiltrageProjetsTest.Controls.Add(ddlList);
        divChampsFiltrageProjetsTest.Controls.Add(txtValeur);
        divChampsFiltrageProjetsTest.Controls.Add(btnAdd);
然后,您应该能够在单击事件中使用它们

for (int i = 1; i < Convert.ToInt32(Session["nbFiltres"].ToString()) + 1; i++)
{

    Session["typeFiltreProjets" + i.ToString()] = ddlList.SelectedValue.ToString();
    Session["valeurFiltreProjets" + i.ToString()] = txtValeur.Text;
}
for(int i=1;i
动态添加控件时,您需要确保在每次回发后重新创建这些控件

在.aspx文件中声明控件与从代码隐藏以编程方式添加控件之间存在差异:

以声明方式添加控件时所有控件都会出现在将来的回发中,因为在每次回发请求中,ASP.NET Webforms都会使用设计器中的声明以及Viewstate和posted表单中的数据重新创建页面状态

以编程方式添加控件时,ASP.NET将尝试执行相同的操作:使用.aspx文件+ViewState+posted表单中的声明在服务器上重新创建页面状态。它无法知道您已经修改了控件层次结构,并且添加或删除了一些控件,因为在回发之间不会以任何方式跟踪这些更改。这就是为什么您需要在每次回发时重新创建预期的层次结构

您需要重新运行在页面_Init事件上添加控件的代码。这一点很重要,因为在此事件之后,ASP.NET将尝试将状态信息从ViewState和发布的数据绑定到控件层次结构,该层次结构现在将包含动态控件。如果不这样做,您仍将拥有控件,但无法检索用户在这些控件上发布的数据

以下是您的代码的外观:

public void Page_Init(object sender, EventArgs e){
    CreateDynamicControls();
}

public void CreateDynamicControls(){
    HtmlGenericControl span = new HtmlGenericControl("span");
    DropDownList ddlList = new DropDownList();
    TextBox txtValeur = new TextBox();
    Button btnAdd = new Button();
    ListItem item1 = new ListItem("No. Projet", "no");
    ListItem item2 = new ListItem("Désignation Projet", "desi");
    ListItem item3 = new ListItem("Chef de Projets", "chef");

    span.Style.Add(HtmlTextWriterStyle.Color, "Black");
    span.InnerText = "Filtre " + (i + 1).ToString() + " : ";

    ddlList.ID = "ddlFiltreProjets" + (i + 1).ToString();
    ddlList.Items.Add(item1);
    ddlList.Items.Add(item2);
    ddlList.Items.Add(item3);

    txtValeur.ID = "txtValeurFiltreProjets" + (i + 1).ToString();
    txtValeur.ForeColor = System.Drawing.Color.Black;

    btnAdd = btnAddFiltre1;

    divChampsFiltrageProjetsTest.Controls.Add(span);
    divChampsFiltrageProjetsTest.Controls.Add(ddlList);
    divChampsFiltrageProjetsTest.Controls.Add(txtValeur);
    divChampsFiltrageProjetsTest.Controls.Add(btnAdd);
}

您可以在文章中找到有关MSDN的更多信息。

您是在页面生命周期的什么时候添加控件的?如果是在page init之后,则需要在每次回发之后重新创建它们。实际上,我在page_preRender中,现在切换到page_Load,它就可以工作了。但是控件现在被重新创建了……也许这是一个很小的提示,但是大多数程序员选择用英语编写所有的代码,对于将来的问题,可能会使代码的某些部分更容易阅读(例如,不是每个人都懂法语)。如果你的团队在将来的某一天获得国际成员,这也会让事情变得更容易:)我知道^^实际上我的团队是由法国人组成的,只有法国人才能访问代码,但我计划在添加注释和优化代码时用英语输入代码。事实上,这是一个粗略的代码版本。是的,我用FindControl制作了它,但我用3*I测试我是否可以通过它的编号访问控件。
public override void OnLoad(../*cant' remember the parameters*/){
    if(!Page.IsPostBack){
       span.Style.Add(HtmlTextWriterStyle.Color, "Black");

        span.InnerText = "Filtre " + (i + 1).ToString() + " : ";

        ddlList.ID = "ddlFiltreProjets" + (i + 1).ToString();
        ddlList.Items.Add(item1);
        ddlList.Items.Add(item2);
        ddlList.Items.Add(item3);

        txtValeur.ID = "txtValeurFiltreProjets" + (i + 1).ToString();
        txtValeur.ForeColor = System.Drawing.Color.Black;

        btnAdd = btnAddFiltre1;

        divChampsFiltrageProjetsTest.Controls.Add(span);
        divChampsFiltrageProjetsTest.Controls.Add(ddlList);
        divChampsFiltrageProjetsTest.Controls.Add(txtValeur);
        divChampsFiltrageProjetsTest.Controls.Add(btnAdd);
for (int i = 1; i < Convert.ToInt32(Session["nbFiltres"].ToString()) + 1; i++)
{

    Session["typeFiltreProjets" + i.ToString()] = ddlList.SelectedValue.ToString();
    Session["valeurFiltreProjets" + i.ToString()] = txtValeur.Text;
}
public void Page_Init(object sender, EventArgs e){
    CreateDynamicControls();
}

public void CreateDynamicControls(){
    HtmlGenericControl span = new HtmlGenericControl("span");
    DropDownList ddlList = new DropDownList();
    TextBox txtValeur = new TextBox();
    Button btnAdd = new Button();
    ListItem item1 = new ListItem("No. Projet", "no");
    ListItem item2 = new ListItem("Désignation Projet", "desi");
    ListItem item3 = new ListItem("Chef de Projets", "chef");

    span.Style.Add(HtmlTextWriterStyle.Color, "Black");
    span.InnerText = "Filtre " + (i + 1).ToString() + " : ";

    ddlList.ID = "ddlFiltreProjets" + (i + 1).ToString();
    ddlList.Items.Add(item1);
    ddlList.Items.Add(item2);
    ddlList.Items.Add(item3);

    txtValeur.ID = "txtValeurFiltreProjets" + (i + 1).ToString();
    txtValeur.ForeColor = System.Drawing.Color.Black;

    btnAdd = btnAddFiltre1;

    divChampsFiltrageProjetsTest.Controls.Add(span);
    divChampsFiltrageProjetsTest.Controls.Add(ddlList);
    divChampsFiltrageProjetsTest.Controls.Add(txtValeur);
    divChampsFiltrageProjetsTest.Controls.Add(btnAdd);
}