听起来像一个简单的工作,但还没有弄清楚。我有一个编辑个人资料页面,其中所有用户数据从数据库拉到Page_Load上的相应文本框,标签等。下拉列表绑定到表格如下我的ddl如下:
<asp:DropDownList ID="ddlGender" runat="server" Width="160px" AutoPostBack="True" OnDataBound="ddlGender_DataBound">
</asp:DropDownList>
并绑定如下:
protected void BindGenderDropDown()
{
string CS = ConfigurationManager.ConnectionStrings["SportsActiveConnectionString"].ConnectionString;
using (SqlConnection con = new SqlConnection(CS))
{
con.Open();
SqlCommand cmd = new SqlCommand("select * from tblGenders", con);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
ddlGender.DataSource = ds;
ddlGender.DataTextField = "GenderName";
ddlGender.DataValueField = "GenderId";
ddlGender.DataBind();
}
ddlGender.Items.Insert(0, new ListItem("---Select---", "0"));
ddlGender.SelectedIndex = 0;
}
我无法在下拉列表中设置值。这就是我所做的:
private void ExtractData()
{
string CS = ConfigurationManager.ConnectionStrings["fgff"].ConnectionString;
using (SqlConnection con = new SqlConnection(CS))
{
con.Open();
SqlCommand cmd = new SqlCommand("Select * from tblRegPlayers1 where UserId='PL00011'", con);
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
string path = rdr["ProfilePicPath"].ToString();
hfImagePath.Value = Path.GetFileName(path);
txtFName.Text = rdr["FirstName"].ToString();
txtLName.Text = rdr["LastName"].ToString();
txtEmailAddress.Text = rdr["EmailAdd"].ToString();
txtContactNumber.Text = rdr["MobileNo"].ToString();
txtdob.Value = rdr["DOB"].ToString();
txtStreetAddress.Text = rdr["StreetAddress"].ToString();
txtZipCode.Text = rdr["ZipCode"].ToString();
ddlGender.Items.FindByText(rdr["Gender"].ToString()).Selected = true;
}
}
但它表示&#39;对象未设置为实例&#39;。所以我玩了一下,试着在DataBound中这样做:
protected void ddlGender_DataBound(object sender, EventArgs e)
{
string CS = ConfigurationManager.ConnectionStrings["SportsActiveConnectionString"].ConnectionString;
using (SqlConnection con = new SqlConnection(CS))
{
con.Open();
SqlCommand cmd = new SqlCommand("Select * from tblRegPlayers1 where UserId='PL00011'", con);
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
ddlGender.Items.FindByText(rdr["Gender"].ToString()).Selected = true;
}
}
现在它不会抛出任何错误,也不会选择该值。
PS:1。我已为ddl设置了Autopostback为true。 2.我知道sqlInjection并进行了更改以使其看起来更简单。
我的最终PageLoad看起来像这样:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
//btnReset.Visible = false;
ExtractData();
BindDisabilityDropDown();
BindGenderDropDown();
BindStateDropDown();
}
if (hfImagePath.Value == "" || hfImagePath.Value == "0")
{
imgCropped.ImageUrl = "~/ProfilePictures/DefaultProfilePicture.png";
hfImagePath.Value = "0";
}
else
{
imgCropped.ImageUrl = "~/ProfilePictures/" + hfImagePath.Value;
}
//lblRegistration.Text = Session["Button"].ToString();
}
答案 0 :(得分:0)
DataSet ds = new DataSet();
da.Fill(ds);
ddlGender.DataSource = ds;
ddlGender.DataTextField = "GenderName";
ddlGender.DataValueField = "GenderId";
ddlGender.DataBind();
您正在尝试将值设置为特定的列,但您将其绑定到DataSet而不是DataTable。 (DataSet没有列只有DataTables。)
尝试以下假设DataSet返回一个表并且列名与表结构匹配:
string strDesiredSelection = "Male";
DataSet ds = new DataSet();
da.Fill(ds);
ddlGender.DataSource = ds.Tables[0];
ddlGender.DataTextField = "GenderName";
ddlGender.DataValueField = "GenderId";
ddlGender.DataBind();
foreach(ListItem li in ddlGender.Items){
if(li.Value.Equals(strDesiredSelection)){
ddlGender.SelectedIndex = ddlGender.Items.IndexOf(li);
}
}
答案 1 :(得分:0)
首先,在ExtractData
方法中实际绑定DropDownList
之前,您正在调用BindGenderDropDown
。这意味着当您尝试查找并设置所选项目时,您的下拉列表将没有项目。首先,您需要将数据绑定代码移到ExtractData
之上。
其次,您试图以不寻常的方式设置所选值。不应尝试FindByText
,而应尝试设置SelectedValue
。
我将假设rdr["Gender"]
中ExtractData
的内容是您绑定到下拉菜单的GenderId
,而不是GenderName
中的显示值。我还假设GenderId
是M
而F
和GenderName
是Male
和Female
(尽管如果您的实际实施略有不同,那么#39;好的)。
尝试更改:
ddlGender.Items.FindByText(rdr["Gender"].ToString()).Selected = true;
要:
ddlGender.SelectedValue = rdr["Gender"].ToString();
另外一定要删除为DataBound
处理程序添加的代码,这里没有必要。