如何从数据库创建 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
之前建立购物车和 OrderLines
或 OrderDetail
条记录。
* 出于这个原因,通常值得在 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 页面。
当我从下拉列表中选择任何选项然后将其插入数据库时,即使我选择了第二个或第三个选项,也会自动选择第一个选项;每次只插入第一个选项。
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
之前建立购物车和 OrderLines
或 OrderDetail
条记录。
* 出于这个原因,通常值得在 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 页面。