Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > ASP .Net > Re: Dropdownlist and SelectedItem in ASP.Net

Reply
Thread Tools

Re: Dropdownlist and SelectedItem in ASP.Net

 
 
Jos Branders
Guest
Posts: n/a
 
      06-25-2003
"md" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed)...
> Hello all -
>
> I am having a goofy problem that I strongly suspect is a (gasp!) bug in my
> code, but I can't for the life of me figure it out.
>
> I have a Dropdownlist control on a page that is bound in code to a

DataTable
> object. That works fine, it shows the data. I select an item in the list
> other than the first item, but when I click on a button and read the
> .SelectedItem.Value property it always returns the value for the first

item in the list.
>
> I used the command window and displayed Dropdownlist1.Items(x).Value for
> each item in the list (there are only three at the moment), and it

displayed
> the correct value, but when I try to use the .SelectedItem.Value property

I always get the value for the first entry in the list, regardless of what
was chosen.
>
> Anybody run into this? I appreciate any help anyone can offer.
>
> Matt


My guess is that you are databinding again on postback.
This causes your server to lose the state of your list.

Try changing your Page_Load event in something like this:

Sub Page_Load(Sender As Object, E As EventArgs)

If Not Page.IsPostBack Then
-----Bind your list here-----
End If

End Sub

--

Jos Branders



 
Reply With Quote
 
 
 
 
md
Guest
Posts: n/a
 
      06-25-2003
Thanks for your reply. I had AutoPostback set to False on the dropdownlist.
I recoded it with AutoPostback set to true and rebound only when IsPostBack
was false, and now it works. Thanks for your help, but I don't really
understand why it has to post back to the server just to change the selected
item in the dropdown, but apparently it does. Of course I'm not an ASP.Net
expert (obviously). Thanks again for your help.

Matt

"Jos Branders" <(E-Mail Removed)> wrote in message
news:3ef9a719$0$1045$(E-Mail Removed). be...
> "md" <(E-Mail Removed)> wrote in message
> news:(E-Mail Removed)...
> > Hello all -
> >
> > I am having a goofy problem that I strongly suspect is a (gasp!) bug in

my
> > code, but I can't for the life of me figure it out.
> >
> > I have a Dropdownlist control on a page that is bound in code to a

> DataTable
> > object. That works fine, it shows the data. I select an item in the list
> > other than the first item, but when I click on a button and read the
> > .SelectedItem.Value property it always returns the value for the first

> item in the list.
> >
> > I used the command window and displayed Dropdownlist1.Items(x).Value for
> > each item in the list (there are only three at the moment), and it

> displayed
> > the correct value, but when I try to use the .SelectedItem.Value

property
> I always get the value for the first entry in the list, regardless of what
> was chosen.
> >
> > Anybody run into this? I appreciate any help anyone can offer.
> >
> > Matt

>
> My guess is that you are databinding again on postback.
> This causes your server to lose the state of your list.
>
> Try changing your Page_Load event in something like this:
>
> Sub Page_Load(Sender As Object, E As EventArgs)
>
> If Not Page.IsPostBack Then
> -----Bind your list here-----
> End If
>
> End Sub
>
> --
>
> Jos Branders
>
>
>



 
Reply With Quote
 
 
 
 
Jos Branders
Guest
Posts: n/a
 
      06-25-2003
"md" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed)...
> Thanks for your reply. I had AutoPostback set to False on the

dropdownlist.
> I recoded it with AutoPostback set to true and rebound only when

IsPostBack
> was false, and now it works. Thanks for your help, but I don't really
> understand why it has to post back to the server just to change the

selected
> item in the dropdown, but apparently it does.


This is because you want to read the SelectedItem.Value when you
click on a button.
Obviously this has to be done on the server, and therefore you need a
postback.
Since the button also causes a postback, I think you don't even need
the AutoPostback setting.

--

Jos Branders


 
Reply With Quote
 
William F. Robertson, Jr.
Guest
Posts: n/a
 
      06-25-2003
You don't need to set the AutoPostBack to true for the DropDownList to get
the selected item.

If you aren't rebinding the data to the list box. On the button_click
event on the server, the SelectedItem.Value property will hold the first
selected item (in case it is a multiselect).

Setting AutoPostBack to true, just adds an extra round trip to the server.

If you want, post a little bit of code if you need more help.

bill

"Jos Branders" <(E-Mail Removed)> wrote in message
news:3ef9ac94$0$1051$(E-Mail Removed). be...
> "md" <(E-Mail Removed)> wrote in message
> news:(E-Mail Removed)...
> > Thanks for your reply. I had AutoPostback set to False on the

> dropdownlist.
> > I recoded it with AutoPostback set to true and rebound only when

> IsPostBack
> > was false, and now it works. Thanks for your help, but I don't really
> > understand why it has to post back to the server just to change the

> selected
> > item in the dropdown, but apparently it does.

>
> This is because you want to read the SelectedItem.Value when you
> click on a button.
> Obviously this has to be done on the server, and therefore you need a
> postback.
> Since the button also causes a postback, I think you don't even need
> the AutoPostback setting.
>
> --
>
> Jos Branders
>
>



 
Reply With Quote
 
md
Guest
Posts: n/a
 
      06-25-2003
Hi Bill -

Here's the code I had before that didn't seem to work.

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
lblHeading.Text = "Edit vendor information for " &
GetServerNameFromId(CInt(Request.Params.Item("id") ))
LoadVendorList()
LoadVendorTypeList()
End Sub

Private Sub LoadVendorList()
Dim SQL As String = "SELECT * FROM vendor ORDER BY CompanyName"
Dim Conn As New SqlClient.SqlDataAdapter(SQL,
Global.sipedb_connection_string)
Dim Tbl As New DataTable()

Conn.Fill(Tbl)

cmbVendorList.DataSource = Tbl
cmbVendorList.DataBind()
End Sub

Private Sub LoadVendorTypeList()
Dim SQL As String = "SELECT * FROM vendortypes"
Dim Tbl As New DataTable()
Dim Conn As New SqlClient.SqlDataAdapter(SQL,
Global.sipedb_connection_string)

Conn.Fill(Tbl)

cmbVendorTypeList.DataSource = Tbl
cmbVendorTypeList.DataBind()
End Sub

Then at this point the page is displayed. Then I would use cmbVendorList to
let the user select a vendor and click an Add button with this code:

Private Sub cmdAddExisting_Click(ByVal sender As Object, ByVal e As
System.EventArgs) Handles cmdAddExisting.Click
Dim SQL As String = "SELECT * FROM Vendors"
Dim Conn As New SqlClient.SqlDataAdapter(SQL,
Global.sipedb_connection_string)
Dim CommBuilder As New SqlClient.SqlCommandBuilder(Conn)
Dim NewRecord As DataRow
Dim Tbl As New DataTable()

Conn.Fill(Tbl)

NewRecord = Tbl.NewRow

NewRecord.BeginEdit()
NewRecord.Item("server_id") = CInt(Request.Params.Item("id"))
NewRecord.Item("vendor_id") = cmbVendorList.SelectedItem.Value
NewRecord.EndEdit()

Tbl.Rows.Add(NewRecord)

Conn.Update(Tbl)
BindVendorsData()
End Sub

The BindVendorsData routine binds a table to a datagrid to display the
vendor that was just added.

The line that reads NewRecord.Item("vendor_id") =
cmbVendorList.SelectedItem.Value always returned the value for the first
item in the dropdown list, even if I had selected a different one. Using
Jos's idea makes it work, I just didn't really understand why it needed to
post back to the server.

Thanks for taking a look.

Matt

"William F. Robertson, Jr." <(E-Mail Removed)> wrote in message
news:%(E-Mail Removed)...

> You don't need to set the AutoPostBack to true for the DropDownList to get
> the selected item.
>
> If you aren't rebinding the data to the list box. On the button_click
> event on the server, the SelectedItem.Value property will hold the first
> selected item (in case it is a multiselect).
>
> Setting AutoPostBack to true, just adds an extra round trip to the server.
>
> If you want, post a little bit of code if you need more help.
>
> bill
>
> "Jos Branders" <(E-Mail Removed)> wrote in message
> news:3ef9ac94$0$1051$(E-Mail Removed). be...
> > "md" <(E-Mail Removed)> wrote in message
> > news:(E-Mail Removed)...
> > > Thanks for your reply. I had AutoPostback set to False on the

> > dropdownlist.
> > > I recoded it with AutoPostback set to true and rebound only when

> > IsPostBack
> > > was false, and now it works. Thanks for your help, but I don't really
> > > understand why it has to post back to the server just to change the

> > selected
> > > item in the dropdown, but apparently it does.

> >
> > This is because you want to read the SelectedItem.Value when you
> > click on a button.
> > Obviously this has to be done on the server, and therefore you need a
> > postback.
> > Since the button also causes a postback, I think you don't even need
> > the AutoPostback setting.
> >
> > --
> >
> > Jos Branders
> >
> >

>
>



 
Reply With Quote
 
md
Guest
Posts: n/a
 
      06-25-2003
By the way, the DataTextField and DataValueField properties are set in the
VS.Net propertieswindow.

"md" <(E-Mail Removed)> wrote in message
news:e7I%(E-Mail Removed)...
> Hi Bill -
>
> Here's the code I had before that didn't seem to work.
>
> Private Sub Page_Load(ByVal sender As System.Object, ByVal e As
> System.EventArgs) Handles MyBase.Load
> lblHeading.Text = "Edit vendor information for " &
> GetServerNameFromId(CInt(Request.Params.Item("id") ))
> LoadVendorList()
> LoadVendorTypeList()
> End Sub
>
> Private Sub LoadVendorList()
> Dim SQL As String = "SELECT * FROM vendor ORDER BY CompanyName"
> Dim Conn As New SqlClient.SqlDataAdapter(SQL,
> Global.sipedb_connection_string)
> Dim Tbl As New DataTable()
>
> Conn.Fill(Tbl)
>
> cmbVendorList.DataSource = Tbl
> cmbVendorList.DataBind()
> End Sub
>
> Private Sub LoadVendorTypeList()
> Dim SQL As String = "SELECT * FROM vendortypes"
> Dim Tbl As New DataTable()
> Dim Conn As New SqlClient.SqlDataAdapter(SQL,
> Global.sipedb_connection_string)
>
> Conn.Fill(Tbl)
>
> cmbVendorTypeList.DataSource = Tbl
> cmbVendorTypeList.DataBind()
> End Sub
>
> Then at this point the page is displayed. Then I would use cmbVendorList

to
> let the user select a vendor and click an Add button with this code:
>
> Private Sub cmdAddExisting_Click(ByVal sender As Object, ByVal e As
> System.EventArgs) Handles cmdAddExisting.Click
> Dim SQL As String = "SELECT * FROM Vendors"
> Dim Conn As New SqlClient.SqlDataAdapter(SQL,
> Global.sipedb_connection_string)
> Dim CommBuilder As New SqlClient.SqlCommandBuilder(Conn)
> Dim NewRecord As DataRow
> Dim Tbl As New DataTable()
>
> Conn.Fill(Tbl)
>
> NewRecord = Tbl.NewRow
>
> NewRecord.BeginEdit()
> NewRecord.Item("server_id") = CInt(Request.Params.Item("id"))
> NewRecord.Item("vendor_id") = cmbVendorList.SelectedItem.Value
> NewRecord.EndEdit()
>
> Tbl.Rows.Add(NewRecord)
>
> Conn.Update(Tbl)
> BindVendorsData()
> End Sub
>
> The BindVendorsData routine binds a table to a datagrid to display the
> vendor that was just added.
>
> The line that reads NewRecord.Item("vendor_id") =
> cmbVendorList.SelectedItem.Value always returned the value for the first
> item in the dropdown list, even if I had selected a different one. Using
> Jos's idea makes it work, I just didn't really understand why it needed to
> post back to the server.
>
> Thanks for taking a look.
>
> Matt
>
> "William F. Robertson, Jr." <(E-Mail Removed)> wrote in message
> news:%(E-Mail Removed)...
>
> > You don't need to set the AutoPostBack to true for the DropDownList to

get
> > the selected item.
> >
> > If you aren't rebinding the data to the list box. On the button_click
> > event on the server, the SelectedItem.Value property will hold the first
> > selected item (in case it is a multiselect).
> >
> > Setting AutoPostBack to true, just adds an extra round trip to the

server.
> >
> > If you want, post a little bit of code if you need more help.
> >
> > bill
> >
> > "Jos Branders" <(E-Mail Removed)> wrote in message
> > news:3ef9ac94$0$1051$(E-Mail Removed). be...
> > > "md" <(E-Mail Removed)> wrote in message
> > > news:(E-Mail Removed)...
> > > > Thanks for your reply. I had AutoPostback set to False on the
> > > dropdownlist.
> > > > I recoded it with AutoPostback set to true and rebound only when
> > > IsPostBack
> > > > was false, and now it works. Thanks for your help, but I don't

really
> > > > understand why it has to post back to the server just to change the
> > > selected
> > > > item in the dropdown, but apparently it does.
> > >
> > > This is because you want to read the SelectedItem.Value when you
> > > click on a button.
> > > Obviously this has to be done on the server, and therefore you need a
> > > postback.
> > > Since the button also causes a postback, I think you don't even need
> > > the AutoPostback setting.
> > >
> > > --
> > >
> > > Jos Branders
> > >
> > >

> >
> >

>
>



 
Reply With Quote
 
William F. Robertson, Jr.
Guest
Posts: n/a
 
      06-25-2003
My comments are c style comments -> //

Here is the new Page_Load

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load

lblHeading.Text = "Edit vendor information for " &
GetServerNameFromId(CInt(Request.Params.Item("id") ))

//if the Request.Params doesn't change, then I would move it to inside
the following if statement.

if not Page.IsPostBack then
LoadVendorList()
LoadVendorTypeList()
endif
End Sub

By putting the Load functions in a NOT postback if statement, the data will
be only be rebound to your list boxes once. That way when you access the
SelectedItem property it will have what was selected. When you rebind the
DropDownList boxes on every page_load you are replacing the state of the
list boxes, and thus, the control doesn't know what was selected since all
the data is "new".

Page_Load runs every single time anything goes to the page. If there is an
autopostback, button click, refresh, it doesn't matter, the page_load will
run, so if you are ever going to be binding to a control, and the DATA (not
selection) is static (not changing) I would highly recommend protecting the
binding code with the Page.IsPostBack.

Oh, I am sure you have EnableViewState to true on both of the list boxes?

If you have any other questions, I will be checking this thread for the next
couple days.

HTH,

bill


"md" <(E-Mail Removed)> wrote in message
news:e7I#(E-Mail Removed)...
> Hi Bill -
>
> Here's the code I had before that didn't seem to work.
>
> Private Sub Page_Load(ByVal sender As System.Object, ByVal e As
> System.EventArgs) Handles MyBase.Load
> lblHeading.Text = "Edit vendor information for " &
> GetServerNameFromId(CInt(Request.Params.Item("id") ))
> LoadVendorList()
> LoadVendorTypeList()
> End Sub
>
> Private Sub LoadVendorList()
> Dim SQL As String = "SELECT * FROM vendor ORDER BY CompanyName"
> Dim Conn As New SqlClient.SqlDataAdapter(SQL,
> Global.sipedb_connection_string)
> Dim Tbl As New DataTable()
>
> Conn.Fill(Tbl)
>
> cmbVendorList.DataSource = Tbl
> cmbVendorList.DataBind()
> End Sub
>
> Private Sub LoadVendorTypeList()
> Dim SQL As String = "SELECT * FROM vendortypes"
> Dim Tbl As New DataTable()
> Dim Conn As New SqlClient.SqlDataAdapter(SQL,
> Global.sipedb_connection_string)
>
> Conn.Fill(Tbl)
>
> cmbVendorTypeList.DataSource = Tbl
> cmbVendorTypeList.DataBind()
> End Sub
>
> Then at this point the page is displayed. Then I would use cmbVendorList

to
> let the user select a vendor and click an Add button with this code:
>
> Private Sub cmdAddExisting_Click(ByVal sender As Object, ByVal e As
> System.EventArgs) Handles cmdAddExisting.Click
> Dim SQL As String = "SELECT * FROM Vendors"
> Dim Conn As New SqlClient.SqlDataAdapter(SQL,
> Global.sipedb_connection_string)
> Dim CommBuilder As New SqlClient.SqlCommandBuilder(Conn)
> Dim NewRecord As DataRow
> Dim Tbl As New DataTable()
>
> Conn.Fill(Tbl)
>
> NewRecord = Tbl.NewRow
>
> NewRecord.BeginEdit()
> NewRecord.Item("server_id") = CInt(Request.Params.Item("id"))
> NewRecord.Item("vendor_id") = cmbVendorList.SelectedItem.Value
> NewRecord.EndEdit()
>
> Tbl.Rows.Add(NewRecord)
>
> Conn.Update(Tbl)
> BindVendorsData()
> End Sub
>
> The BindVendorsData routine binds a table to a datagrid to display the
> vendor that was just added.
>
> The line that reads NewRecord.Item("vendor_id") =
> cmbVendorList.SelectedItem.Value always returned the value for the first
> item in the dropdown list, even if I had selected a different one. Using
> Jos's idea makes it work, I just didn't really understand why it needed to
> post back to the server.
>
> Thanks for taking a look.
>
> Matt
>
> "William F. Robertson, Jr." <(E-Mail Removed)> wrote in message
> news:%(E-Mail Removed)...
>
> > You don't need to set the AutoPostBack to true for the DropDownList to

get
> > the selected item.
> >
> > If you aren't rebinding the data to the list box. On the button_click
> > event on the server, the SelectedItem.Value property will hold the first
> > selected item (in case it is a multiselect).
> >
> > Setting AutoPostBack to true, just adds an extra round trip to the

server.
> >
> > If you want, post a little bit of code if you need more help.
> >
> > bill
> >
> > "Jos Branders" <(E-Mail Removed)> wrote in message
> > news:3ef9ac94$0$1051$(E-Mail Removed). be...
> > > "md" <(E-Mail Removed)> wrote in message
> > > news:(E-Mail Removed)...
> > > > Thanks for your reply. I had AutoPostback set to False on the
> > > dropdownlist.
> > > > I recoded it with AutoPostback set to true and rebound only when
> > > IsPostBack
> > > > was false, and now it works. Thanks for your help, but I don't

really
> > > > understand why it has to post back to the server just to change the
> > > selected
> > > > item in the dropdown, but apparently it does.
> > >
> > > This is because you want to read the SelectedItem.Value when you
> > > click on a button.
> > > Obviously this has to be done on the server, and therefore you need a
> > > postback.
> > > Since the button also causes a postback, I think you don't even need
> > > the AutoPostback setting.
> > >
> > > --
> > >
> > > Jos Branders
> > >
> > >

> >
> >

>
>



 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
dropdownlist.selecteditem,value, and index Abraham Luna ASP .Net Web Controls 0 11-05-2005 07:55 PM
Problem assigning selectedItem.Value to a dropdownlist filled with OnItemDataBound Antonio D'Ottavio ASP .Net 1 09-19-2005 09:41 AM
DropDownList SelectedItem Problem Ivan ASP .Net 4 11-25-2003 03:14 PM
Help Me~~My DropDownList Can not get the"BigClassList.SelectedItem.Text" there is an error: System.NullReferenceException huobazi ASP .Net 0 07-01-2003 10:38 PM
Re: Dropdownlist and SelectedItem in ASP.Net Marina ASP .Net 0 06-25-2003 01:40 PM



Advertisments