如何从数据库创建 DropDownList?

How can I make a DropDownList from the database?

当我从下拉列表中选择任何选项然后将其插入数据库时​​,即使我选择了第二个或第三个选项,也会自动选择第一个选项;每次只插入第一个选项。

Order.aspx.cs

protected void selectList()
        {
            conn = new SqlConnection(connstr);
            conn.Open();
            sql = "SELECT * FROM Product";
            SqlCommand comm = new SqlCommand(sql, conn);
            adap = new SqlDataAdapter(comm);
            DataSet ds = new DataSet();
            adap.Fill(ds);
            ProductID.DataTextField = ds.Tables[0].Columns["Name"].ToString();
            ProductID.DataValueField = ds.Tables[0].Columns["Id"].ToString();
            ProductID.DataSource = ds.Tables[0];
            ProductID.DataBind();
        }

    protected void Page_Load(object sender, EventArgs e)
        {
            bindGrid();
            selectList();

        }

     protected void btnAdd_Click(object sender, EventArgs e)
        {
            selectList();
            sql = "INSERT INTO [Order] (CustomerID,ProductID ,EmployeeID,Quantity,Date) VALUES ('" + CustomerID.Text + "','" + ProductID.SelectedValue + "','" + EmployeeID.Text + "','" + Quantity.Text + "','" + Date.Text +  "')";
            conn = new SqlConnection(connstr);
            conn.Open();
            comm = new SqlCommand(sql, conn);
            comm.ExecuteNonQuery();
            conn.Close();
            bindGrid();
            ScriptManager.RegisterStartupScript(Page, Page.GetType(),
                "myPrompt", "alert('Successfully Updated!');", true);
        }

Order.aspx

   Product ID:
         <asp:DropDownList ID="ProductID" runat="server"  CssClass="form-control" ></asp:DropDownList>

Page_Load()来不及绑定您的列表

请记住,在使用 Web 表单时,您需要从头开始,并且必须针对每个请求重新创建所有数据项...即使是简单的按钮单击事件*。这就是为什么在 Page_Load() 方法中调用 bindGrid() 的原因。但是,此过程的一部分还涉及恢复 ViewState,因此单击按钮将知道选择了哪个项目。问题是 ViewState 数据在调用 Page_Load() 方法之前恢复。 因此 网格仍然是空的 ,并且SelectedValue您需要从 ViewState 获取的信息无法正确设置。

您可以通过将绑定网格数据的代码移动到 Init 或 Pre_Init 事件来解决此问题。

虽然我在这里,但我需要重申我对 SQL 注入的评论。这是一件 非常重要的事情 ... 这种事情非常重要,即使在学习和 proof-of-concept 项目中也不会出错。我建议使用 Google 来了解有关使用 C# 参数化查询的更多信息。

此外,很少将选择直接插入 Orders table。通常有一个单独的“ShoppingCart”table,使用会话密钥作为 table 的主键,用户可以在完成订单和创建最终 Order 之前建立购物车和 OrderLinesOrderDetail 条记录。


* 出于这个原因,通常值得在 Web 表单中在客户端浏览器上做更多这样的工作,在 javascript.

实际上,这里的错误是页面加载。在 99% 的所有页面中,您只想在第一页加载时绑定和加载。大多数(如果不是全部)asp 控件将自动为您保留。所以,你的大错误是:

protected void Page_Load(object sender, EventArgs e)
    {
        bindGrid();
        selectList();

    }

上面要变成这样:

protected void Page_Load(object sender, EventArgs e)
    {
       if (!IsPostBack) 
       {
           bindGrid();
           selectList();
       }
    }

事实上,除非您遵循上述规则,否则您真的无法构建功能性的 Web 表单页面。请记住,任何按钮,任何 post-back,页面加载事件将再次 运行。

所以是的,页面加载是正确的地方,但在将近 99% 的情况下,您需要将该代码包装在所有重要的 isPostBack = false 代码存根中。

完成上述操作后,您的整个页面将运行得非常好,非常正常,并且在几乎所有情况下,您都会发现控件正确地保留了它们的值和设置。

所以,不,页面加载不会太快,页面加载是加载数据绑定控件的正确事件和位置 - 但是,您只想在真正的第一个页面加载时执行此操作。

事实上,SO 每天大约有 1 个问题,按照上述简单规则可以解决他们的困境和问题。没注意上面的isPostBack?您甚至无法真正构建一个有效的 asp.net 页面。