ASP.NET DetailsVew在插入项目后重新绑定下拉列表

时间:2012-10-10 17:21:34

标签: asp.net

我是ASP.NET的新手,并且一直在尝试使下拉列表在DetailsView中正常工作,但到目前为止还没有运气。我很快就能完成这一切,非常感谢有人可以帮助我。

我得到的错误是:

  

数据绑定方法,如Eval(),XPath()和Bind()只能是   在数据绑定控件的上下文中使用。

我在DetailsView中有这个代码:

<EditItemTemplate>  
    <asp:DropDownList id="VendorName" 
        datasourceid="VendorSqlDataSource" 
        AutoPostBack="true" 
        datatextfield="VendorName" 
        DataValueField="VendorID"    
        SelectedValue='<%# Bind("VendorID") %>'   
        runat="server" 
        OnSelectedIndexChanged="ddlCategory_SelectedIndexChanged" /> 

    <asp:SqlDataSource ID="VendorSqlDataSource" 
        ConnectionString="<%$Connectionstrings:ConnectionString%>"  
        SelectCommand="SELECT VendorID, VendorName from MDF_Vendor" 
        runat="server">  
    </asp:SqlDataSource>  
</EditItemTemplate>  


<EditItemTemplate> 
    <asp:DropDownList id="VendorBUName" 
        datasourceid="VendorBUSqlDataSource"  
        datatextfield="VendorBUName" 
        DataValueField="VendorBUID"    
        SelectedValue='<%# Bind("VendorBUID") %>'   
        runat="server"/> 

    <asp:SqlDataSource ID="VendorBUSqlDataSource" 
        runat="server" 
        ConnectionString="<%$Connectionstrings:ConnectionString%>" 
        selectcommand="SELECT VendorBUID, VendorBUName 
                       from MDF_VendorBU 
                       Where VendorID = @VendorID" 
        <SelectParameters>  
            <asp:Parameter Name="VendorID" Type="Int32" />  
        </SelectParameters>  
    </asp:SqlDataSource>  
</EditItemTemplate> 

在我的代码隐藏列表中,我有这段代码在VendorName选中时重建VendorBUName下拉列表。

protected void ddlVendor_SelectedIndexChanged
               (object sender, EventArgs e)
{

    DropDownList ddlVendor =
        (DropDownList)DetailsView1.FindControl("VendorName");
    DropDownList ddlVendorBU =
        (DropDownList)DetailsView1.FindControl("VendorBUName");


    if (ddlVendorBU != null)
    {
        Response.Write("SelectChanged");
        int VendorID = Convert.ToInt32(ddlVendor.SelectedValue.ToString());
        Response.Write("VendorID: " + VendorID);

        ddlVendorBU.Items.Clear();

        string strConn = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
        SqlConnection con = new SqlConnection(strConn);
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = con;
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "SELECT VendorBUID, VendorBUName FROM dbo.MDF_VendorBU WHERE VendorID = @VendorID";
        cmd.Parameters.AddWithValue("@VendorID", VendorID);
        DataSet objDs = new DataSet();
        SqlDataAdapter dAdapter = new SqlDataAdapter();
        dAdapter.SelectCommand = cmd;
        con.Open();
        dAdapter.Fill(objDs);

        con.Close();


        if (objDs.Tables[0].Rows.Count > 0)
        {
            foreach (DataRow dr in objDs.Tables[0].Rows)
            {
                ddlVendorBU.Items.Insert(0, new ListItem( (dr["VendorBUName"]).ToString(), "-1") );
            }
            ddlVendorBU.DataBind();  //<-- Problem HERE can not rebind it.
        }

    }
}

到目前为止,这在DetailsView中有效。我单击“编辑”,这两个下拉列表选择了正确的值。当我在VendorName ddl中选择另一个供应商时,它会刷新VendorBUName列表。大!但是,当我尝试ddlVendorBU.DataBind();要重新绑定VendorBUName列表,它会给出上面的错误。如果删除它,它将不会更新VendorBUName的记录,因为它没有绑定到该字段。

我完全陷入困境,如果有人可以请求帮助。提前谢谢!

3 个答案:

答案 0 :(得分:2)

如果使用ddlVendorBU.DataBind();您必须定义DataSource属性。

如果您希望插入Item,则不需要DataBind方法。

所以

您可以在没有DataBind的情况下尝试此代码

foreach (DataRow dr in objDs.Tables[0].Rows)
{
     ddlVendorBU.Items.Insert(0, new ListItem( (dr["VendorBUName"]).ToString(), "-1") );
}

答案 1 :(得分:1)

您是否偶然在页面加载上进行任何绑定?如果是这样,你检查它是否是一个回发?您的页面加载将在您的选择更改事件发生之前触发,如果它反弹某些内容,则表示您没有使用相同的数据。

答案 2 :(得分:0)

您可以不使用Bind("VendorBUID")并以编程方式设置SelectedValue属性吗?我认为这就是造成问题的原因。

现在,重新绑定你的ddlVendorBU也会消除你手动添加的任何内容,因为这就是绑定的作用。因此,您可能还需要在重新绑定之前设置DataSource属性,以使用正确的项创建DDL。

此外,由于您希望ddlVendorBU具有有意义的SelectedValue属性(或者我推断),因此在添加项目时,不应在每次循环中使用-1作为值参数。使用BUID字段。

ETA:代码:

if (objDs.Tables[0].Rows.Count > 0) 
{
   ddlVendorBU.DataSource = objDs.Tables[0];
   ddlVendorBU.DataTextField = "VendorBUName";
   ddlVendorBU.DataValueField = "VendorBUID";
   ddlVendorBU.DataBind();
}