检查下拉列表更改时未显示正确的值

时间:2014-01-02 16:53:56

标签: c# asp.net

这个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;
    }

在这种情况下,文本框保持为空。为什么呢?

3 个答案:

答案 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]