Не удалось найти элемент управления '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) не находятся в одном и том же контейнере именования. У вас есть несколько вариантов:
- Добавьте SqlDataSource в свою разметку, вместо того, чтобы создавать только в выделенном коде, а затем добавить его в конце страницы Lifecylce. Это самый простой вариант.
- Добавьте 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;