这个winforms代码:
private void Form1_Load(object sender, EventArgs e)
{
comboBox1.Items.Add("Item 1");
comboBox1.Items.Add("Item 2");
comboBox1.Items.Add("Item 3");
comboBox1.Items.Add("Item 4");
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
textBox1.Text = comboBox1.Text;
}
完美无缺。我选择一个项目,文本框显示组合框的相同内容
现在对于ASP.NET来说是相同的:
protected void Page_Load(object sender, EventArgs e)
{
DropDownList1.Items.Add("Item 1");
DropDownList1.Items.Add("Item 2");
DropDownList1.Items.Add("Item 3");
DropDownList1.Items.Add("Item 4");
}
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
TextBox1.Text = DropDownList1.Text;
}
在这种情况下,文本框保持为空。为什么呢?
答案 0 :(得分:4)
当您更改选择时,页面是否会回发到服务器?
区别在于C#,它在应用程序的体系结构中。 WinForms是在单个机器上运行的单个应用程序。因此,当事件发生时,整个应用程序都知道它。另一方面,WebForms实际上是由网络连接分隔的两个事物。有服务器端代码和客户端代码。除非服务器端代码由某种请求调用,否则它不能与客户端代码交互。
所以并不是代码不起作用,而是当你更改DropDownList
上的选择时,它需要以某种方式通知服务器此事件。一种方法是将其设置为自动回发:
DropDownList1.AutoPostBack = true;
这会使行为与您期望的更加一致,因为它会立即通知服务器端代码选择已更改。 然而,在Web应用程序中,这会导致不良用户体验。不断将页面发回服务器是很丑陋的。它会伤害到很多表现。
您可以使用一些JavaScript代码来执行您的逻辑客户端。或者也许再次使用JavaScript向服务器端资源(通常是WebForms中的HttpHandler)发出AJAX请求,以执行服务器端处理并检索某种结果。这继续举例说明了客户端和服务器端之间的分离。在浏览器上下文中运行的JavaScript代码完全了解页面的事件模型,并且可以立即响应select
元素中的选择更改。
最终,你没有看到C#语言的工作方式有所不同。您所看到的是Web应用程序工作方式与桌面应用程序工作方式的根本区别。 Web应用程序,无论WebForms多年来试图掩盖多少,都是客户端和服务器之间的请求/响应系统。为了运行服务器端代码,必须发送请求。
答案 1 :(得分:0)
您需要指定DropDownlist的当前值,该项目是当前选定的....
答案 2 :(得分:0)
在asp.net上,下拉列表会在viewstate上保存列表,并且您不能在回发时再次添加它们,否则您将重置选择。为了使其按预期工作,请将IsPostBack检查添加为:
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
DropDownList1.Items.Add("Item 1");
DropDownList1.Items.Add("Item 2");
DropDownList1.Items.Add("Item 3");
DropDownList1.Items.Add("Item 4");
}
}
此外,选择来自SelectedValue
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
TextBox1.Text = DropDownList1.SelectedValue;
}
如果您已禁用页面或此控件的视图状态,则可以始终使用.Form
作为
Request.Form[DropDownList1.UniqueID]