webForumDet fria alternativet

Sätta värde och text i en dropdownlista

.NET

16 svar · 684 visningar · startad av m_soderlund

Medlem sedan sep. 20026 425 inlägg
Frågan#1

Jag använder lite kod för att plocka ut info om anställda ur en databas och sen visa dessa i en dropdownlista.
Dropdownlistan fylls med den infon jag vill - texten som syns på webbsidan är alltså okej - MEN
värdet på varje option-val i dropdownlistan är densamma som texten!
Jag vill att värdet enbart ska vara id som jag plockat ut ur databasen.

Alltså: i stället för att HTML-koden ska se ut så här:

<option value="8 - Martin Söderlund [it-martin]">8 - Martin Söderlund [it-martin]</option>

så ska den enbart se ut så här:

<option value="8">8 - Martin Söderlund [it-martin]</option>

Koden nedan är den jag använder.

    'procedur för att visa anställda i en dropdownlista
    Sub ddl__visa_anstallda()

    'plocka ut anställda ur tabell i databasen
        Dim SQL As string = "SELECT id,fornamn,efternamn,anstallningsid FROM tbl_anstallda ORDER BY id asc"

        'felhantering med Try .. Catch
        Try

        'anslut till databasen & skapa ett OleDbDataReader-objekt
        Dim Cn As OleDbConnection = new OleDbConnection(CnStr)
        Dim Cm As OleDbCommand = new OleDbCommand(SQL,Cn)
            Cn.Open()
        Dim objDataReader As OleDbDataReader = Cm.ExecuteReader()

        'skapa en ny samling av listposter (option-val i dropdownlistan i default.aspx)
        Dim ddlBox As new ListItemCollection

            'lägg till text
            ddlBox.Add(new ListItem("Välj"))
            ddlBox.Add(new ListItem())

            Dim item As ListItem = new ListItem()

            'lägg till val i kategoridropdownlistan
            while(objDataReader.Read())
                item.Value = objDataReader("id")
                item.Text = objDataReader("id").toString() & " - " & objDataReader("fornamn").toString() & " " & objDataReader("efternamn").toString() & " [" & objDataReader("anstallningsid").toString() & "]"

                ddlBox.Add(new ListItem(item.toString))
            end while

            'bind data till dropdownlistan
            ddl_anstallda.DataSource = ddlBox
            ddl_anstallda.DataBind()

        'stäng objekt
        objDataReader.Close()
        Cn.Close()

        'fånga felmeddelande
        Catch ex As exception
            lbl_error.Text = "Ett fel uppstod när visning av anställda från databasen skulle ske..<br />Error: " & ex.Message
        End Try

    End Sub

Som alltid är jag MYCKET tacksam för den hjälp jag kan få. :D

Jag kan ju också tillägga att

'ddlBox.Add(new ListItem(objDataReader("id").toString() & " - " & objDataReader("fornamn").toString() & " " & objDataReader("efternamn").toString() & " [" & objDataReader("anstallningsid").toString() & "]",objDataReader("id")))

inte fungerar bättre än befintlig kod i while-blocket.

Medlem sedan sep. 20011 914 inlägg
#2
class sidans_class
   sub Page_load(sender as object, e as EventArgs) handles Page.Load
      if not Page.IsPostBack
         BindData()
      end if
   end sub

   sub BindData()
      ddl_anstallda.DataSource = GetMyDamnData()
      ddl_anstallda.DataValueField = ID
      ddl_anstallda.DataTextField = Info
      ddl_anstallda.DataBind()
   end sub

   function GetMyDamnData() as ArrayList
      Dim SQL As string = "SELECT id,fornamn,efternamn,anstallningsid FROM tbl_anstallda ORDER BY id asc"

      Dim Cn As OleDbConnection = new OleDbConnection(CnStr)
      Dim Cm As OleDbCommand = new OleDbCommand(SQL,Cn)
      Dim arr As new ArrayList()

      try
         Cn.Open()
         Dim dr As OleDbDataReader = Cm.ExecuteReader()        

         'lägg till val i kategoridropdownlistan
         while(dr.Read())
            arr.Add(new Data(dr("id").ToString(), dr("fornamn").toString() & " " & dr("efternamn").toString() & " [" & dr("anstallningsid").toString() & "]")
         end while
      Catch ex As exception
         lbl_error.Text = "Ett fel uppstod när visning av anställda från databasen skulle ske..<br />Error: " & ex.Message
      finally
         dr.Close()
         Cn.Close()
      end try
      return arr
   end function
end class
[1]red// nu även i vb.net[/1]
public class Data
{
   private _id, _info as string

   Public Property ID As string
      Get 
         Return _id
      End Get
      Set 
         _id = value
      End Set
   End Property

   Public Property Info As string
      Get 
         Return _info 
      End Get
      Set 
         _info = value
      End Set
   End Property

   sub new()
   end sub

   sub new(dim ID as string, dim Info as string)
      me._id = ID
      me._info = Ifo
   end sub
end class
Medlem sedan sep. 20026 425 inlägg
#3

Tackar Dino, jag ska testa detta. Återkommer! :bire

Medlem sedan nov. 2003569 inlägg
#4

va mycket overkill. ni gör det svårare än vad det är.

soderlund. i whileloopen så byter du ut:

ddlBox.Add(new ListItem(item.toString));

till:

ddl_anstallda.Items.Add(item);

också raderar du:
Dim ddlBox As new ListItemCollection
ddl_anstallda.DataSource = ddlBox
ddl_anstallda.DataBind()

...
så ska du se att det ordnar sig.

Medlem sedan sep. 20026 425 inlägg
#5

Hm.. Min kod ser nu ut så här, och jag får ett felmeddelande om CustomErrors i web.config.
Någon som direkt ser vad som är fel?

'lägg till text
            ddl_Anstallda.Items.Add("Välj anställd")
            ddl_Anstallda.Items.Add("")

            Dim item As ListItem = new ListItem()

            'lägg till val i kategoridropdownlistan
            while(objDataReader.Read())

                item.Value = objDataReader("id")
                item.Text = objDataReader("id").toString() & " - " & objDataReader("fornamn").toString() & " " & objDataReader("efternamn").toString() & " [" & objDataReader("anstallningsid").toString() & "]"

ddl_anstallda.Items.Add(item)
            end while

        'stäng objekt
        objDataReader.Close()

Har förkortat koden lite, komplett kod ses i mitt första inlägg i denna tråd, förutom att jag ändrat det som Nöff skrev. :)

Medlem sedan maj 20012 812 inlägg
#6

Nej. Men testa att ändra CustomErrors till off(eller var det on) i din webconfig, så står det på vilket rad felet är på.

Däremot så kommer din DropDownList inte innehålla det du tror den skall göra. Tänker inte berätta vad felet är, du får fundera själv på det när du ser hur din dropdownlist blir.

Den snyggast lösning, för att fylla en dropdownlista är den som dino föreslog, vilket också fixar ditt problem.

ddl_anstallda.DataSource = GetMyDamnData()
ddl_anstallda.DataValueField = ID
ddl_anstallda.DataTextField = Info
ddl_anstallda.DataBind()

- M

Medlem sedan nov. 2003569 inlägg
#7

oj, du måste också lägga:

Dim item As ListItem = new ListItem()

i din while loop... glömde det :)

såhär ska den se ut:

while(objDataReader.Read())
Dim item As ListItem = new ListItem()
item.Value = objDataReader("id")
item.Text = objDataReader("id").toString() & " - " & objDataReader("fornamn").toString() & " " & objDataReader("efternamn").toString() & " [" & objDataReader("anstallningsid").toString() & "]"

ddl_anstallda.Items.Add(item)
end while

Medlem sedan nov. 2003569 inlägg
#8

varför har du [ ] på anstallningsID? . kan inte VB, men du har det bara på en? och inte de andra?.

Medlem sedan sep. 20026 425 inlägg
#9

Nöff skrev:

varför har du [ ] på anstallningsID? . kan inte VB, men du har det bara på en? och inte de andra?.

Det är bara en designmässig fråga, det är HTML-kod, inte .NET-relaterad kod. :)

Återkommer senare.

Medlem sedan sep. 20026 425 inlägg
#10

Problemet löst!

Problemet är nu löst, använde mig huvudsakligen av Nöffs kod (fick inte till Dinos). Lösning:

'procedur för att visa anställda i en dropdownlista
    Sub ddl__visa_anstallda()

        'plocka ut anställda ur tabell i databasen
        Dim SQL As string = "SELECT id,fornamn,efternamn,anstallningsid FROM tbl_anstallda ORDER BY id asc"

        'felhantering med Try .. Catch
        Try

        'anslut till databasen & skapa ett OleDbDataReader-objekt
        Dim Cn As OleDbConnection = new OleDbConnection(CnStr)
        Dim Cm As OleDbCommand = new OleDbCommand(SQL,Cn)
            Cn.Open()
        Dim objDataReader As OleDbDataReader = Cm.ExecuteReader()

        'skapa en ny samling av listposter (option-val i dropdownlistan i default.aspx)
        Dim ddlBox As new ListItemCollection

            'lägg till text
            ddlBox.Add(new ListItem("Välj anställd"))
            ddlBox.Add(new ListItem())

            'bind data till dropdownlistan
            ddl_anstallda.DataSource = ddlBox
            ddl_anstallda.DataBind()

            'lägg till val i kategoridropdownlistan
            while(objDataReader.Read())

                Dim item As ListItem = new ListItem()
                    item.Value = objDataReader("id")
                    item.Text = objDataReader("id").toString() & " - " & objDataReader("fornamn").toString() & " " & objDataReader("efternamn").toString() & " [" & objDataReader("anstallningsid").toString() & "]"

                ddl_anstallda.Items.Add(item)
            end while

        'stäng objekt
        objDataReader.Close()
        Cn.Close()

        'fånga felmeddelande
        Catch ex As exception
            lbl_error.Text = "Ett fel uppstod när visning av anställda från databasen skulle ske..<br />Error: " & ex.Message
        End Try

    End Sub

Tackar för hjälpen!

Medlem sedan sep. 20026 425 inlägg
#11

Trots att mitt problem nu är löst, så verkar ju Dinos kod vara "den snyggaste lösningen" enligt Gladh. :D
Jag försöker använda mig av Dinos kod, men det fungerar inte alltför bra. Så
här ser min kod ut:

'funktion för att ta ut data ur databasen om anställda, för att senare kunna visa info i en dropdownlista
    function GetMyDamnData() as ArrayList

      dim SQL As string = "SELECT id,fornamn,efternamn,anstallningsid FROM tbl_anstallda ORDER BY id asc"

      dim Cn As OleDbConnection = new OleDbConnection(CnStr)
      dim Cm As OleDbCommand = new OleDbCommand(SQL,Cn)
      dim arr As new ArrayList()

      try
         Cn.Open()
         dim dr As OleDbDataReader = Cm.ExecuteReader()

         'lägg till val i kategoridropdownlistan
         while(dr.Read())
            arr.Add(new Data(dr("id").ToString(), dr("fornamn").toString() & " " & dr("efternamn").toString() & " [" & dr("anstallningsid").toString() & "]"))
         end while
      Catch ex As exception
         lbl_error.Text = "Ett fel uppstod när visning av anställda från databasen skulle ske..<br />Error: " & ex.Message
      finally
         dr.Close()
         Cn.Close()
      end try
      return arr

   end function

   'procedur för att binda data och visa anställda i en dropdownlista
    sub ddl__visa_anstallda()

        ddl_anstallda.DataSource = GetMyDamnData()
        ddl_anstallda.DataValueField = ID
        ddl_anstallda.DataTextField = Info
        ddl_anstallda.DataBind()

    end sub

Jag har all kod i en codebehind-sida, default.vb. I default.vb finns klassen def_ som ärver
Page, och klassen uc_ som ärver UserControl. Koden ovan finns i klassen uc_ tillsammans med lite andra
procedurer. Självfallet har jag också klassen Data (längst ner i default.vb, efter uc_-klassen).

public class Data

   private _id, _info as string

   Public Property ID As string
      Get
         Return _id
      end Get
      Set
         _id = value
      end Set
   end Property

   Public Property Info As string
      Get
         Return _info
      end Get
      Set
         _info = value
      end Set
   end Property

   sub _new()
   end sub

   sub _new(dim ID as string, dim Info as string)
      me._id = ID
      me._info = Info
   end sub

end class

Jag har fått ett antal felmeddelanden, och det som nu är det primära är detta:

Compiler Error Message: BC30057: Too many arguments to 'Public Sub New()'.

Source Error:

Line 492: 'lägg till val i kategoridropdownlistan
Line 493: while(dr.Read())
Line 494: arr.Add(new Data(dr("id").ToString(), dr("fornamn").toString() & " " & dr("efternamn").toString() & " [" & dr("anstallningsid").toString() & "]"))
Line 495: end while
Line 496: Catch ex As exception

Det är alltså min ArrayList som genererar ett fel - men vilket, och inte minst - vilken åtgärd ska man vidta?

MS föreslår detta, men som vanligt är de ju inte de bästa på att förklara saker och ting.

Method '<methodname>' has multiple definitions with identical signatures

A Function or Sub procedure declaration uses the identical procedure name and argument list as a previous declaration. One possible cause is an attempt to overload the original procedure. Overloaded procedures must have different argument lists.

To correct this error

Change the procedure name or the argument list, or remove the duplicate declaration.

Vidare så finns det några felmeddelanden till. Nedan är alla felmeddelanden jag har:

e:\web\project\behind\default.vb(494) : error BC30057: Too many arguments to 'Public Sub New()'.

        arr.Add(new Data(dr("id").ToString(), dr("fornamn").toString() & " " & dr("efternamn").toString() & " \[" & dr("anstallningsid").toString() & "\]"))

e:\web\project\behind\default.vb(499) : error BC30451: Name 'dr' is not declared.

     dr.Close()
     \~\~        

e:\web\project\behind\default.vb(513) : error BC30451: Name 'Info' is not declared.

    ddl_anstallda.DataTextField = Info
                                  \~\~\~\~

e:\web\project\behind\default.vb(574) : error BC30269: Method '_new' has multiple definitions with identical signatures.

sub _new()
~~~~
e:\web\project\behind\default.vb(577) : error BC30181: Specifiers valid only at the beginning of a declaration.

sub _new(dim ID as string, dim Info as string)

Väldigt mycket på en gång, men hoppas på att allt kan lösa sig. Det är alltid kul att ha alternativa lösningar
på ett problem, inte minst för andra som behöver använda sig av samma funktion på en webbsida. :)

Medlem sedan maj 20012 812 inlägg
#12

Om du skall använda Dinos lösning så skall du inte ha med någon arraylista()

'funktion för att ta ut data ur databasen om anställda, för att senare kunna visa info i en dropdownlista
    function GetMyDamnData() as ArrayList

      dim SQL As string = "SELECT id,fornamn,efternamn,anstallningsid FROM tbl_anstallda ORDER BY id asc"

      dim Cn As OleDbConnection = new OleDbConnection(CnStr)
      dim Cm As OleDbCommand = new OleDbCommand(SQL,Cn)

      try
         Cn.Open()
         dim dr As OleDbDataReader = Cm.ExecuteReader()

         ddl_anstallda.DataSource = dr 
         ddl_anstallda.DataValueField = ID
         ddl_anstallda.DataTextField = Info
         ddl_anstallda.DataBind()

      finally
         dr.Close()
         Cn.Close()
      end try
   end function

Tyvärr kan man INTE lägga ihop flera fält så som du gjort för att få fram info med denna variant. Alltså måste detta lösas antingen i SQL Satsen (i ditt fall) eller i en class som en property om man använder en O/R mapper.

- Magnus

Medlem sedan sep. 20011 914 inlägg
#13

Varför har du satt underscore? Ta bort. De är ju dessa som är classens constructors.

'Usch, fy, grr
sub _new()
end sub

sub _new(dim ID as string, dim Info as string)
   me._id = ID
   me._info = Info
end sub
'Jippi, hurra, wow
sub new()
end sub

sub new(dim ID as string, dim Info as string)
   me._id = ID
   me._info = Info
end sub
Medlem sedan sep. 20026 425 inlägg
#14

Tackar för svaren! Dino, jag satte bara dit _ före new för att testa om det blev någon skillnad med _new i stället för new. Det blev det inte. Sen glömde jag bort att ta bort _.

Tackar för svaren, återigen!

Medlem sedan sep. 20011 914 inlägg
#15

Ok, var ju självklart tvungen att se varför det inte funkade. Och det var på grund av att en del mina vb.net
kunskaper försvunnit. Ber om ursäkt för tidigare kod. Denna koden är i alla fall testad och skall fungera felfritt.

Public Class bindCCToDDL
    Inherits System.Web.UI.Page

   Protected WithEvents ddlTest As DropDownList

   Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      If Not Page.IsPostBack Then
         BindData()
      End If
   End Sub

   Sub BindData()
      ddlTest.DataSource = GetMyDamnData()
      ddlTest.DataValueField = "ID"
      ddlTest.DataTextField = "Info"
      ddlTest.DataBind()
   End Sub

   Function GetMyDamnData() As ArrayList
      Dim SQL As String = "SELECT id,(fornamn & ' ' & efternamn & ' [' & anstallningsid & ']') as crap FROM tbl_anstallda ORDER BY id asc"

      Dim Cn As New System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\test.mdb")
      Dim Cm As New System.Data.OleDb.OleDbCommand(SQL, Cn)
      Dim dr As System.Data.OleDb.OleDbDataReader
      Dim arr As New ArrayList

      Try
         Cn.Open()
         dr = Cm.ExecuteReader()

         While (dr.Read())
            arr.Add(New Data(dr("id"), dr("crap")))
         End While
      Catch ex As Exception
         '
      Finally
         dr.Close()
         If Cn.State = ConnectionState.Open Then
            Cn.Close()
         End If
      End Try

      Return arr
   End Function
End Class

Public Class Data
   Private _id, _info As String

   Public Property ID() As String
      Get
         Return _id
      End Get
      Set(ByVal Value As String)
         _id = value
      End Set
   End Property

   Public Property Info() As String
      Get
         Return _info
      End Get
      Set(ByVal Value As String)
         _info = Value
      End Set
   End Property

   Sub New()
   End Sub

   Sub New(ByVal ID As String, ByVal Info As String)
      Me._id = ID
      Me._info = Info
   End Sub
End Class
Medlem sedan sep. 20026 425 inlägg
#16

Underbart Dino, koden ska testas senare i kväll! :bire :D

Medlem sedan nov. 2003569 inlägg
#17

och jag måste protestera å det grövsta att använda arraylist istället för ListItem på DropDownlist ;)

i ListItem har du ju alla egenskaper som behövs för dropdownilstor, såsom "value", "selected", "text", och annat smått o gott som "Csstyles" och sånt.

while(reader.Read()==true) 
{

ListItem mylist=new ListItem();
mylist.Text=myreaderundersvarsalt["test"].ToString();
mylist.Value=myreaderundersvarsalt["ID"].ToString();

if(mylist.Value=1)
{ 
	mylist.Selected=true;
}

mydropdownlist.Items.Add(mylist);
}
293 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
142 ms — deklarationer (db)
0 ms — hämta statistik (cache)
148 ms — hämta tråd, inlägg och bilagor (db)
142 ms — ändringar (db)