0

我正在调试,我得到了上面列出的奇怪错误。这很奇怪,因为我的 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”。“在 ControlParameter 'Company' 中找不到控件 'DropDownList1'。”

VS 将异常放在第 39 行,即

         GridView1.DataBind();

如果您需要查看更多代码,请发表评论,我会发布更多。

4

2 回答 2

1

根据您在问题中更新的代码,我可以看到问题在于 DropDownList 和 SqlDataSource (此 ControlParameter 所属的)不在同一个命名容器中。你有几个选择:

  1. 将 SqlDataSource 添加到您的标记中,而不是仅在代码隐藏中创建,然后在页面生命周期的后期添加它。这是最简单的选择。
  2. 在页面生命周期的早期以编程方式将 SqlDataSource 添加到 Page.Controls 集合。就像在 Init 事件期间一样。

像这样:

protected void Page_Init(object sender, EventArgs e)
{
    Page.Controls.Add(Gridsource);
}
于 2013-07-03T19:04:42.490 回答
0

Alexander:你为什么给cp.ControlID = "DropDownList1" ;,DropDownList1 是 DropDownList 的一个对象,所以你不能将这个名称作为字符串传递,而cp.Type = System.TypeCode.String; 是字符串类型,所以cp不能包含对象。

如果要将控件添加到cp中,则cp.ControlId=DropDownList1.ClientID;

于 2013-07-03T19:16:54.293 回答