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

时间:2015-04-16 14:15:37

标签: asp.net sql-server ddl

听起来像一个简单的工作,但还没有弄清楚。我有一个编辑个人资料页面,其中所有用户数据从数据库拉到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();
}

2 个答案:

答案 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中的显示值。我还假设GenderIdMFGenderNameMaleFemale(尽管如果您的实际实施略有不同,那么#39;好的)。

尝试更改:

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

要:

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

另外一定要删除为DataBound处理程序添加的代码,这里没有必要。

相关问题