C# 在下拉列表发生更改时检查下拉列表不会显示正确的值

C# 在下拉列表发生更改时检查下拉列表不会显示正确的值,c#,asp.net,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

此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;
    }

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

您需要指定DropDownlist的当前值,哪个项目是当前选定的….

您需要指定DropDownlist的当前值,哪个项目是当前选定的….

当您更改选择时,页面是否回发到服务器

区别不在于C#,而在于应用程序的体系结构。WinForms是在一台机器上运行的单个应用程序。因此,当事件发生时,整个应用程序都知道它。另一方面,WebForms实际上是两个被网络连接分开的东西。有服务器端代码和客户端代码。除非服务器端代码由某种请求调用,否则它不能与客户端代码交互

因此,这并不是因为代码不起作用,而是当您更改
DropDownList
上的选择时,它需要以某种方式将此事件通知服务器。一种方法是将其设置为自动回发:

DropDownList1.AutoPostBack = true;
这将使行为更符合您的预期,因为它会立即通知服务器端代码选择已更改。然而,在web应用程序中,这会导致不希望的用户体验。不断地将页面发回服务器是很难看的。这对性能影响很大

您可以使用一些JavaScript代码在客户端执行逻辑。或者使用JavaScript向服务器端资源(通常是WebForms中的HttpHandler)发出AJAX请求,以执行服务器端处理并检索某种结果。这继续说明了客户端和服务器端之间的分离。在浏览器上下文中运行的JavaScript代码完全了解页面的事件模型,可以立即响应
select
元素中的选择更改


最终,你看不到C语言的工作方式有什么不同。您看到的是web应用程序与桌面应用程序工作方式的根本区别。Web应用程序,不管多年来WebForms试图掩盖多少,都是客户机和服务器之间的请求/响应系统。要运行服务器端代码,必须发送请求。

更改选择时,页面是否会发回服务器

区别不在于C#,而在于应用程序的体系结构。WinForms是在一台机器上运行的单个应用程序。因此,当事件发生时,整个应用程序都知道它。另一方面,WebForms实际上是两个被网络连接分开的东西。有服务器端代码和客户端代码。除非服务器端代码由某种请求调用,否则它不能与客户端代码交互

因此,这并不是因为代码不起作用,而是当您更改
DropDownList
上的选择时,它需要以某种方式将此事件通知服务器。一种方法是将其设置为自动回发:

DropDownList1.AutoPostBack = true;
这将使行为更符合您的预期,因为它会立即通知服务器端代码选择已更改。然而,在web应用程序中,这会导致不希望的用户体验。不断地将页面发回服务器是很难看的。这对性能影响很大

您可以使用一些JavaScript代码在客户端执行逻辑。或者使用JavaScript向服务器端资源(通常是WebForms中的HttpHandler)发出AJAX请求,以执行服务器端处理并检索某种结果。这继续说明了客户端和服务器端之间的分离。在浏览器上下文中运行的JavaScript代码完全了解页面的事件模型,可以立即响应
select
元素中的选择更改


最终,你看不到C语言的工作方式有什么不同。您看到的是web应用程序与桌面应用程序工作方式的根本区别。Web应用程序,不管多年来WebForms试图掩盖多少,都是客户机和服务器之间的请求/响应系统。要运行服务器端代码,必须发送请求。

在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;
    }
如果已禁用页面或此控件的viewstate,则始终可以使用
.Form
将此控件的内容定向回发

Request.Form[DropDownList1.UniqueID]

在asp.net上,dropdownlist将列表保存在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;
    }
如果已禁用页面或此控件的viewstate,则始终可以使用
.Form
将此控件的内容定向回发

Request.Form[DropDownList1.UniqueID]

不应该
TextBox1.Text
TextBox1.Text
?C#区分大小写。@蒂姆大概是将他的
TextBox
变量命名为
TextBox1
,而不是
TextBox1
。否则它不会编译,而不是编译和不运行。您能为第二个代码段包含相关的标记吗?Web应用程序需要另一个HTTP请求(通常通过Web表单中的回发),服务器代码才能响应用户交互。是C#(桌面)文本框1中的
?@Tim是小写的“t”。在C#(对于ASP.NET)Tex中