Не удалось найти элемент управления 'MainContent_DropDownList1' в ControlParameter 'Company'

Я отлаживал и получал странную ошибку, указанную выше. Это было странно, потому что мой Dropdownlist называется DropDownlist1. Когда я установил его равным этому ранее, отладчик сказал мне, что не может привести его к строке.

Так вот мой C#, где проблема.

 protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
       Gridsource.ConnectionString = "Data Source=CATALOGSERVER;Initial Catalog=UACOrders;Persist Security Info=True;User ID=Catalog;Password=pass";
        Gridsource.SelectCommandType = SqlDataSourceCommandType.StoredProcedure;
        Gridsource.SelectCommand = "GetOrderHistory";
        Gridsource.DataSourceMode = SqlDataSourceMode.DataSet;
        GridView1.DataSource = Gridsource;

        ControlParameter cp = new ControlParameter();
        cp.ControlID = DropDownList1.ClientID;
        cp.Name = "Company";
        cp.PropertyName = "SelectedValue";
        cp.Type = System.TypeCode.String;
        Gridsource.SelectParameters.Add(cp);
        Gridsource.Page = this;
        this.Controls.Add(Gridsource);
        GridView1.DataBind();
        updatepanel1.Update();
 }

И вот небольшой кусочек asp.net

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<div id="contentarea">     
    <asp:ScriptManager runat="server"></asp:ScriptManager>
    <asp:UpdatePanel runat="server" ChildrenAsTriggers="true" UpdateMode="Conditional" ID="updatepanel1">
        <ContentTemplate>

            <div>
                <asp:Label Text="Company: " runat="server"></asp:Label>
                <asp:DropDownList ID="DropDownList1" runat="server"
                     DataSourceID="company" DataTextField="COMPANY" DataValueField="COMPANY" 
                    OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged"
                     AutoPostBack="true" >
                </asp:DropDownList>
                <asp:SqlDataSource ID="company"
                     runat="server" ConnectionString="<%$ ConnectionStrings:UACOrdersConnectionString %>"
                     SelectCommand="SELECT [Customer] AS [COMPANY] FROM [Accounts] ORDER BY [Customer]">
                </asp:SqlDataSource>
                <asp:SqlDataSource ID="Gridsource" runat="server"></asp:SqlDataSource>

Так что, как ни странно, я могу заставить все это нормально работать в коде asp.net. Но я не могу заставить его работать в коде C#, который требуется для этой конкретной веб-страницы. Итак, еще раз, мне нужно выяснить, чему в действительности должен быть cp.ControlID.

Конкретное исключение: "InvalidOperationException не был обработан кодом пользователя"."Не удалось найти элемент управления" DropDownList1 "в ControlParameter" Компания "."

VS поместил исключение в строку 39, которая

         GridView1.DataBind();

Если вам нужно увидеть больше кода, просто оставьте комментарий, и я буду публиковать больше.

2 ответа

Решение

Исходя из вашего обновленного кода в вашем вопросе, я вижу, что проблема в том, что DropDownList и SqlDataSource (к которому принадлежит этот ControlParameter) не находятся в одном и том же контейнере именования. У вас есть несколько вариантов:

  1. Добавьте SqlDataSource в свою разметку, вместо того, чтобы создавать только в выделенном коде, а затем добавить его в конце страницы Lifecylce. Это самый простой вариант.
  2. Добавьте SqlDataSource в коллекцию Page.Controls программно в начале жизненного цикла страницы. Как во время события Init.

Как это:

protected void Page_Init(object sender, EventArgs e)
{
    Page.Controls.Add(Gridsource);
}

Александр: почему вы даете cp.ControlID = "DropDownList1"; DropDownList1 является объектом DropDownList, поэтому вы не можете передать это имя в виде строки, а cp.Type = System.TypeCode.String; является строковым типом, поэтому cp не может содержать объект.

Если вы хотите добавить элемент управления в cp, тогда cp.ControlId=DropDownList1.ClientID;

Другие вопросы по тегам