我是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的记录,因为它没有绑定到该字段。
我完全陷入困境,如果有人可以请求帮助。提前谢谢!
答案 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();
}