【问题标题】:ASP.NET DetailsVew rebind the dropdownlist after insert itemsASP.NET DetailsVew 在插入项目后重新绑定下拉列表
【发布时间】:2012-10-10 17:21:33
【问题描述】:

我是 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 dropdownlist列表。

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 的记录,因为它没有绑定到该字段。

我完全被卡住了,如果有人可以帮忙的话。提前致谢!

【问题讨论】:

    标签: asp.net


    【解决方案1】:

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

    如果你想插入Item,你不需要DataBind方法。

    所以

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

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

    【讨论】:

    • 是的,如您所见,我在我的代码中这样做了,但是当我更新记录时它不会保存 VendorBUID,因为它没有绑定,对吗?
    • 您可以在添加项目时删除 DataBind:Control.Items.Add
    • 我很乐意为您提供帮助,foreach(objDs.Tables[0].Rows 中的 DataRow dr){ ddlVendorBU.Items.Insert(0, new ListItem( (dr["VendorBUName"]) .ToString(), "-1") ); } 只是这个没有 DataBind()
    • 我很乐意帮助你 Milacay
    【解决方案2】:

    您是否会在页面加载时进行任何类型的绑定?如果是这样,您是否检查它是否是回发?您的页面加载将在您的选择更改事件之前触发,如果它在那里反弹某些东西,您就不会使用相同的数据。

    【讨论】:

      【解决方案3】:

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

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

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

      预计到达时间:代码:

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

      【讨论】:

      • 感谢您的帮助。我也尝试过,但出现错误'CS1061:'System.Web.UI.WebControls.DropDownList'不包含'ItemTextField'的定义,并且没有扩展方法'ItemTextField'接受'System.Web'类型的第一个参数。可以找到 UI.WebControls.DropDownList'(您是否缺少 using 指令或程序集引用?)'。有什么建议吗?
      • 抱歉——我是凭记忆做的。属性名称为 DataTextFieldDataValueField
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多