dropdownlist selectedvalue doesnt change



我有这个dropdownlist,这个加载了我从存储过程中获得的数据,正如你所看到的,加载是正确的,但当我在调试中更改所选值时,所选值不会更改,它保持在第一个加载的值中,在本例中为1。我能做什么?

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim adaptador As New SqlDataAdapter
Dim datos As New DataTable
Dim ord As SqlDataReader

Conexiones.AbrirConexion()
Conexiones.Cnn.Open()
Dim cmd As SqlCommand = New SqlCommand("sp_devolver_empresas", Conexiones.Cnn)
cmd.CommandType = CommandType.StoredProcedure
ord = cmd.ExecuteReader
datos.Load(ord)
cbEmpresas.DataSource = datos
cbEmpresas.DataTextField = "Nombre"
cbEmpresas.DataValueField = "Identificador"
cbEmpresas.DataBind()
Conexiones.Cnn.Close()
End Sub

对于您构建并编写到最后的每个网页?

您必须始终将加载和设置代码放在回邮检查中。

每个按钮、每个下拉列表,以及每次单击按钮或执行任何操作时,页面加载都将始终启动并运行。因此,如果您更改了一个值,您将丢失该值,因为页面设置和加载例如控件(在本例中为下拉列表(每次都会触发,从而覆盖。

在过去的100多个网页中,我写的第一件事就是回邮检查。

所以,你的代码应该是这样的:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
LoadData
End If
End Sub

Sub LoadData()
Dim datos = New DataTable
Using onexiones.Cnn
Using cmd As SqlCommand = New SqlCommand("sp_devolver_empresas", onexiones.Cnn)
cmd.CommandType = CommandType.StoredProcedure
onexiones.Cnn.Open()
datos.Load(cmd.ExecuteReader())
End Using
End Using
cbEmpresas.DataTextField = "Nombre"
cbEmpresas.DataValueField = "Identificador"
cbEmpresas.DataSource = datos
cbEmpresas.DataBind()
End Sub

因此,只有在";真实的";第一页加载你想加载你的网格、下拉列表等吗?记住,即使是一个简单的按钮掉到页面上,你也会有一个点击事件?(每次和每次都会触发页面加载事件(。所以,再一次,你需要IsPostBack测试——我很难在加载事件中找到任何没有这个非常重要的代码存根的网页。

因此,请记住上面的规则-始终将您的设置代码设置为第一次运行-而不是每次网页上出现按钮或其他任何事情时。因此,每次在页面上执行任何操作时,页面加载(与桌面不同(都会触发。

此外,请注意,在我们为下拉列表提供数据源之前,我是如何设置数据文本和值字段的。事实上,我建议您将数据文本和数据值字段放在标记和NOT代码中(从那时起,多个不同的代码例程可以使用该设置,而不是在代码中硬编码(。

例如:

<asp:DropDownList ID="cbEmpresas" runat="server"
DataTextField = "Nombre"
DataValueField = "Identificador" >
</asp:DropDownList>

所以,现在你的代码变成:

cbEmpresas.DataSource = datos
cbEmpresas.DataBind()

我支持一些不习惯的人,比如在代码中为下拉列表设置文本+数据设置,但话说回来,在代码中,你可能想要多个加载组合框的伙伴,因此你现在有多个位置可以放置这两个设置。更好的是,您甚至可以在设计时使用属性表进行设置。(这是一个"小"问题,但我只是在标记中执行这些设置,而不是将它们写在文本/数据设置的代码中(。

一天结束时?只要记住那条黄金法则:;测试";对于回发,所以在if/then中有一个真实的首页加载事件代码。事实上,如果你违反了这个规则,你甚至真的无法建立一个功能性的工作网页。如前所述,据我统计,在我的100个网页中,大约有1-2个没有回发代码存根。与人类必须呼吸空气才能发挥作用相比,这一点同样重要。

为什么要就这个简单的问题发这么长的帖子?在几乎每天的基础上,c和vb.net都会发布一些关于一些组合框、网格视图或其他任何东西是如何的问题;破碎的";并且不起作用。答案是10次中的9次?

开发人员忘记在页面加载代码中使用Not IsPostBack代码存根。

如果我在教asp.net,这将是第一课——始终使用并考虑Not IsPost后台存根的要求。99%的网页都需要这样。或者至少在任何一个网页中,你都有代码要在页面加载时运行,以设置网格、下拉列表、中继器——不管怎样,你都需要代码存根。如此重要,我经常想知道他们是否应该创建一个甚至被称为首页加载的页面?它会消除SO上因不听从上述简单建议而失败的日常帖子和问题。

编辑:现在如何获取代码中的选定值

好的,现在我们已经修复了设置下拉列表的代码,现在我们想在代码中获得用户在下拉列表中做出选择时的值。

你当然有代码来填充下拉列表,但我们也必须为这个下拉列表设置autopostback=true。

所以,说要加载的代码:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
LoadData
End If
End Sub

Sub LoadData()
Using conn As New SqlConnection(My.Settings.TEST4)
Dim strSQL As String =
"SELECT ID, HotelName from tblHotels ORDER BY HotelName"
Using cmdSQL As SqlCommand = New SqlCommand(strSQL, conn)
conn.Open()
Dim rstData As New DataTable
rstData.Load(cmdSQL.ExecuteReader)
cboHotels.DataSource = rstData
cboHotels.DataBind()
End Using
End Using
End Sub

现在选定的索引更改事件:

因此,我们的调试输出将看起来像:

输出:

combo selected value = 82
combo selected Text = Canadian Rocky Mountain Resorts

如前所述,请确保在属性表或标记中将auto-post设置为true。因此,上面在标记中的组合框是这样的:

<asp:DropDownList ID="cboHotels" runat="server"
DataValueField="ID"
DataTextField="HotelName" AutoPostBack="True">
</asp:DropDownList>

最新更新