在页面加载时从数据库设置下拉列表值
setting a dropdownlist value from database on page load
听起来是个简单的工作,但还没弄清楚 out.I 有一个编辑个人资料页面,其中所有用户数据都从数据库拉到 Page_Load.The 下拉列表中的相应文本框、标签等绑定到 table 作为 below.My 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;
}
我无法在下拉列表中设置值 though.Here 我已经这样做了 :
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;
}
}
但是它说 'Object is not set to an instance'。所以我玩了一下并尝试在 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;
}
}
现在它不会抛出任何错误,也不会 select 值。
PS : 1.I 为 ddl 设置了 Autopostback true。
2.I 我知道 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();
}
DataSet ds = new DataSet();
da.Fill(ds);
ddlGender.DataSource = ds;
ddlGender.DataTextField = "GenderName";
ddlGender.DataValueField = "GenderId";
ddlGender.DataBind();
您正在尝试将值设置为特定的列,但您将其绑定到 DataSet 而不是 DataTable。 (数据集只有数据表没有列)。
假设数据集返回了 table 并且列名与您的 table 结构匹配,请尝试以下操作:
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);
}
}
首先,您在 BindGenderDropDown
方法中实际绑定 DropDownList
之前调用了 ExtractData
。这意味着当您尝试查找并设置所选项目时,您的下拉列表将没有任何项目。首先,您需要将数据绑定代码移动到 ExtractData
上方。
其次,您是否尝试以不寻常的方式设置所选值。与其尝试 FindByText
,不如尝试设置 SelectedValue
。
我假设 ExtractData
中 rdr["Gender"]
的内容是您绑定到下拉列表的 GenderId
,而不是 GenderName
中的显示值。我还将假设 GenderId
是 M
和 F
并且 GenderName
是 Male
和 Female
(尽管如果您的实际实施略有不同,那就是好的)。
尝试更改:
ddlGender.Items.FindByText(rdr["Gender"].ToString()).Selected = true;
收件人:
ddlGender.SelectedValue = rdr["Gender"].ToString();
还要确保删除您为 DataBound
处理程序添加的代码,此处不需要。
听起来是个简单的工作,但还没弄清楚 out.I 有一个编辑个人资料页面,其中所有用户数据都从数据库拉到 Page_Load.The 下拉列表中的相应文本框、标签等绑定到 table 作为 below.My 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;
}
我无法在下拉列表中设置值 though.Here 我已经这样做了 :
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;
}
}
但是它说 'Object is not set to an instance'。所以我玩了一下并尝试在 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;
}
}
现在它不会抛出任何错误,也不会 select 值。
PS : 1.I 为 ddl 设置了 Autopostback true。 2.I 我知道 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();
}
DataSet ds = new DataSet();
da.Fill(ds);
ddlGender.DataSource = ds;
ddlGender.DataTextField = "GenderName";
ddlGender.DataValueField = "GenderId";
ddlGender.DataBind();
您正在尝试将值设置为特定的列,但您将其绑定到 DataSet 而不是 DataTable。 (数据集只有数据表没有列)。
假设数据集返回了 table 并且列名与您的 table 结构匹配,请尝试以下操作:
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);
}
}
首先,您在 BindGenderDropDown
方法中实际绑定 DropDownList
之前调用了 ExtractData
。这意味着当您尝试查找并设置所选项目时,您的下拉列表将没有任何项目。首先,您需要将数据绑定代码移动到 ExtractData
上方。
其次,您是否尝试以不寻常的方式设置所选值。与其尝试 FindByText
,不如尝试设置 SelectedValue
。
我假设 ExtractData
中 rdr["Gender"]
的内容是您绑定到下拉列表的 GenderId
,而不是 GenderName
中的显示值。我还将假设 GenderId
是 M
和 F
并且 GenderName
是 Male
和 Female
(尽管如果您的实际实施略有不同,那就是好的)。
尝试更改:
ddlGender.Items.FindByText(rdr["Gender"].ToString()).Selected = true;
收件人:
ddlGender.SelectedValue = rdr["Gender"].ToString();
还要确保删除您为 DataBound
处理程序添加的代码,此处不需要。