【问题标题】:setting a dropdownlist value from database on page load在页面加载时从数据库中设置下拉列表值
【发布时间】:2015-04-16 14:15:36
【问题描述】:

听起来很容易,但还没有弄清楚。我有一个编辑配置文件页面,其中所有用户数据都从数据库中提取到 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;
        }
    }

但它说“对象未设置为实例”。所以我玩了一下,并尝试在 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 并进行了更改以使其看起来更简单。

我的最终页面加载如下所示:

    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();
}

【问题讨论】:

  • 你能发布ddlGender 的 ASP.NET 代码吗?只是为了看看有什么活动等等。
  • 对不起,我的意思是&lt;asp:DropDownList ID="ddlGender" ....&gt;&lt;/asp:DropDownList&gt; 部分,但您添加的代码也很有用。
  • 请将代码发布到您的Page_Load 处理程序中。
  • @Kirk 是的。我也粘贴了。
  • @MikeC - 显然,我把我的 ExtractData() 放在页面加载中。你在说哪组代码?

标签: asp.net sql-server ddl


【解决方案1】:

首先,在BindGenderDropDown 方法中实际绑定DropDownList 之前,您正在调用ExtractData。这意味着当您尝试查找并设置所选项目时,您的下拉列表将没有任何项目。首先,您需要将数据绑定代码移至ExtractData 上方。

其次,您是否正在尝试以不寻常的方式设置所选值。与其尝试FindByText,不如尝试设置SelectedValue

我会假设ExtractDatardr["Gender"] 的内容是您绑定到下拉列表的GenderId,而不是GenderName 中的显示值。我还将假设 GenderIdMFGenderNameMaleFemale (尽管如果您的实际实现略有不同,那没关系)。

尝试改变:

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

收件人:

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

还要确保删除您为DataBound 处理程序添加的代码,这里没有必要。

【讨论】:

  • 哦,是的。我刚刚意识到我在 DataBind 之前调用 ExtractData 的错误。所以当我运行它时,它仍然给我一个错误“下拉列表不能有多个选择”。所以我删除了“ddlGender”。选定索引 = 0; ' 来自 BindGenderDropDown() 的行,现在它工作正常。但是,您的回答仍然可以接受。谢谢。
  • 您可能会通过尝试手动设置Selected 来获得此信息。通过使用我建议的方法,您将避免SelectedIndex = 0 引入的问题。使用 SelectedValueSelectedText 将正确更新各个项目的 Selected 属性。
  • 是的,我通过使用 'ddlGender.SelectedItem.Text = rdr["Gender"].ToString(); 进一步更正了我的代码; '..因为 rdr["Gender"] 也包含一个文本。我现在保留 'ddlGender.SelectedIndex = 0;'在 BindGenderDropDown 中也是如此。所以,现在一切正常。干杯
【解决方案2】:
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);
    }
}

【讨论】:

  • 你想让我在 BindGenderDropDown() 中尝试上述方法吗?那我的选择呢?我是在页面加载或 DataBound 事件的 ExtractData() 中做的吗?
  • @Related Rhymes - 抱歉,我指的是 BindGenderDropDown() 中的代码部分。至于设置选择,您可以在列表为 DataBound 之后执行此操作。但是您的 DataBound 事件处理程序似乎没有必要。我编辑了上面的内容只是为了给你一个替代选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-19
  • 2019-05-14
  • 2014-08-15
  • 1970-01-01
  • 2016-07-03
  • 1970-01-01
相关资源
最近更新 更多