在页面加载时从数据库设置下拉列表值

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

我假设 ExtractDatardr["Gender"] 的内容是您绑定到下拉列表的 GenderId,而不是 GenderName 中的显示值。我还将假设 GenderIdMF 并且 GenderNameMaleFemale (尽管如果您的实际实施略有不同,那就是好的)。

尝试更改:

ddlGender.Items.FindByText(rdr["Gender"].ToString()).Selected = true;

收件人:

ddlGender.SelectedValue = rdr["Gender"].ToString();

还要确保删除您为 DataBound 处理程序添加的代码,此处不需要。