Avatar billede set Nybegynder
25. februar 2008 - 00:08 Der er 4 kommentarer og
1 løsning

asp:Listbox

Jeg har en listbox i en formview som driller lidt.
Hvis der er valgt et enme er der ikke noget galt i at vise resultatet fra databasen, men er der valgt flere elementer får jeg en fejl der siger:

[ArgumentOutOfRangeException: 'Gruppe' has a SelectedValue which is invalid because it does not exist in the list of items.
Parameter name: value]


Min listbox ser sådan ud:


                  <asp:ListBox ID="Gruppe" CssClass="tekst2" SelectionMode="Multiple" runat="server" SelectedValue='<%# Bind("gruppe") %>'>
                      <asp:ListItem Value=""></asp:ListItem>
                      <asp:ListItem Value="Jobcenter/Andre aktører kontakt">Jobcenter/Andre aktører kontakt</asp:ListItem>
                      <asp:ListItem Value="Ambassadør">Ambassadør</asp:ListItem>
                      <asp:ListItem Value="Bestyrelsen">Bestyrelsen</asp:ListItem>
                      <asp:ListItem Value="PR-Udvalg">PR-Udvalg</asp:ListItem>
                      <asp:ListItem Value="Billedredigering">Billedredigering</asp:ListItem>
                      <asp:ListItem Value="Introduktions- og dialogmøder">Introduktions- og dialogmøder</asp:ListItem>
                      <asp:ListItem Value="IT-området">IT-området</asp:ListItem>
                      <asp:ListItem Value="Medlemsservice">Medlemsservice</asp:ListItem>
                      <asp:ListItem Value="Nyhedsbrev">Nyhedsbrev</asp:ListItem>
                      <asp:ListItem Value="Opfølgning på medlemsressourcer">Opfølgning på medlemsressourcer</asp:ListItem>
                      <asp:ListItem Value="Telemarketing">Telemarketing</asp:ListItem>
                      <asp:ListItem Value="Virksomhedsbesøg">Virksomhedsbesøg</asp:ListItem>
                      <asp:ListItem Value="Virksomhedsservice">Virksomhedsservice</asp:ListItem>
                      <asp:ListItem Value="Jobcenter/Andre aktører kontakt tovholder">Jobcenter/Andre aktører kontakt tovholder</asp:ListItem>
                      <asp:ListItem Value="Bestyrelsen tovholder">Bestyrelsen tovholder</asp:ListItem>
                      <asp:ListItem Value="PR-Udvalg tovholder">PR-Udvalg tovholder</asp:ListItem>
                      <asp:ListItem Value="Billedredigering tovholder">Billedredigering tovholder</asp:ListItem>
                      <asp:ListItem Value="Introduktions- og dialogmøder tovholder">Introduktions- og dialogmøder tovholder</asp:ListItem>
                      <asp:ListItem Value="IT-området tovholder">IT-området tovholder</asp:ListItem>
                      <asp:ListItem Value="Medlemsservice tovholder">Medlemsservice tovholder</asp:ListItem>
                      <asp:ListItem Value="Nyhedsbrev tovholder">Nyhedsbrev tovholder</asp:ListItem>
                      <asp:ListItem Value="Opfølgning på medlemsressourcer tovholder">Opfølgning på medlemsressourcer tovholder</asp:ListItem>
                      <asp:ListItem Value="Telemarketing tovholder">Telemarketing tovholder</asp:ListItem>
                      <asp:ListItem Value="Virksomhedsbesøg tovholder">Virksomhedsbesøg tovholder</asp:ListItem>
                      <asp:ListItem Value="Virksomhedsservice tovholder">Virksomhedsservice tovholder</asp:ListItem>
                  </asp:ListBox>


Hvordan kan man gemme og siden hen vise data igen fra en sådan listbox.
Det er intet problem i normal asp, men asp.net driller lidt.

Jeg vil også gerne have vist det valgte på øverste linie når data hentes fra databasen.

Håber på en løsning.

På forhånd mange tak.
Avatar billede simsen Mester
25. februar 2008 - 06:56 #1
Hej set

Jeg håber du kan bruge nedenfor viste fremgangsmåde til noget..... Har du spørgsmål så bare skyd løs:

Min aspx fil:

<asp:CheckBoxList ID="cboxPaymentsMethods" runat="server" RepeatDirection="Vertical" DataTextField="Betalingsmaade" DataValueField="BetalingsmaadeID">
                                    </asp:CheckBoxList>

Min codebehind fil (cs filen):

//Henter betalingsmetoder
            DataTable PaymentMethods = null;
            DataTable PaymentMethodsCompany = null;
            try
            {
                if (api.GetPaymentMethods(ref PaymentMethods) == FaktureringApi.FStatus.Success)
                {
                    cboxPaymentsMethods.DataSource = PaymentMethods.DefaultView;
                    cboxPaymentsMethods.DataBind();

                  //Henter valget af betalingsmetoder for det enkelte firma
                  foreach (ListItem i in cboxPaymentsMethods.Items)
                  {
                        if (api.GetPaymentMethodsCompany(user_id, ref PaymentMethodsCompany) == FaktureringApi.FStatus.Success)                           
                        {
                            for (int j = 0; j < PaymentMethodsCompany.Rows.Count; j++ )
                            {
                                int activatet = Convert.ToInt32(PaymentMethodsCompany.Rows[j]["Aktiveret"].ToString());
                                int paymentid = Convert.ToInt32(PaymentMethodsCompany.Rows[j]["BetalingsmaadeID"].ToString());
                                int payment = Convert.ToInt32(PaymentMethods.Rows[0]["BetalingsmaadeID"].ToString());

                                if (Convert.ToInt32(i.Value.ToString()) == paymentid)
                                {
                                    if (activatet == 1)
                                    {
                                        i.Selected = true;
                                    }
                                }
                            }
                            DataTable dtPayment = null;
                            int paymentType = Convert.ToInt32(i.Value.ToString());

                            if (api.GetPaymentMethod(user_id, paymentType, ref dtPayment) == FaktureringApi.FStatus.Success)
                            {
                            }
                            else
                            {
                                //Opretter den type, som firmaet ikke har som valg i Betalingsmaade tabellen.
                                if (api.SetCompanyPaymentMethod(user_id, paymentType, 0) == FaktureringApi.FStatus.Success)
                                { }
                            }
                        }
                    }
                }
            }
            catch
            { }

Her gemmer jeg så min betalingsmåder:
protected void btnSavePaymentMethods_Click(object sender, EventArgs e)
    {       
        FaktureringApi api = new FaktureringApi();
        int user_id = Convert.ToInt32(Session[FaktureringApi.SessionUserId]);
        int aktiveret = 0;

        clearMessages();

        try
        {
            foreach (ListItem i in cboxPaymentsMethods.Items)
            {
                int paymentID = Convert.ToInt32(i.Value.ToString());
               
                if (i.Selected == true)
                {
                    aktiveret = 1;
                }
                if (api.SetCompanyPaymentMethods(user_id, paymentID, aktiveret) == FaktureringApi.FStatus.Success)
                {
                    //Besked - godt
                }
                else
                {
                    //Besked - fejl
                }
            }
        }
        catch
        {}
    }

mvh
simsen :-)
Avatar billede set Nybegynder
25. februar 2008 - 19:12 #2
Jeg kan ikke rigtig gennemskue koden til mit brug.

I alm. asp bruger jeg:

  <select class="tekst2" multiple name="gruppe" size="3" >
          <option selected><%=rsCheckliste2("Gruppe")%></option>
          <option>AF/Andre aktører kontakt</option>
          <option>Ambassadør</option>
          <option>Bestyrelsen</option>
      <option>PR-Udvalg</option>
          <option>Billedredigering</option>
          <option>Introduktions- og dialogmøder</option>
          <option>IT-området</option>
          <option>Medlemsservice</option>
          <option>Nyhedsbrev</option>
      <option>Opfølgning på medlemsressourcer</option>
      <option>Telemarketing</option>
      <option>Virksomhedsbesøg</option>
          <option>Virksomhedsservice</option>
          <option>AF/Andre aktører kontakt tovholder</option>
          <option>Bestyrelsen tovholder</option>
      <option>PR-Udvalg tovholder</option>
          <option>Billedredigering tovholder</option>
          <option>Introduktions- og dialogmøder tovholder</option>
          <option>IT-området tovholder</option>
          <option>Medlemsservice tovholder</option>
          <option>Nyhedsbrev tovholder</option>
      <option>Opfølgning på medlemsressourcer tovholder</option>
      <option>Telemarketing tovholder</option>
      <option>Virksomhedsbesøg tovholder</option>
          <option>Virksomhedsservice tovholder</option>
          <option>&nbsp;</option>
      </select>

Kan man ikke gøre det samme i asp.net.

Altså når man har valgt flere ListItems og gemt dem i databasen, så vil jeg gerne kunne hente dem alle igen og vise det i ListBoxen.
Men det er der jeg får fejlen, den idet meddelelsen siger af SelectedValue ikke er i listen af Items.
Hat prøvet med SelectedItem, men det virker heller ikke
Avatar billede simsen Mester
26. februar 2008 - 15:41 #3
Hej igen,

Jeg har lavet følgende, hvor den henter fra en access database, og selecter, dem der er selected i databasen - du må selv udvide med de ListItems du nu engang har - både i databasen og i din aspx fil.

Access databasen ser du som følgende:

Tabelnavn: Test
Feltnavn : Navn
Datatype : Tekst

Feltnavn : Aktiv
Datatype : Ja/Nej

Din aspx fil: (Vær her opmærksom på, jeg har ændret Value navnene....slettet mellemrum)

<asp:ListBox ID="Gruppe" CssClass="tekst2" SelectionMode="Multiple" runat="server" SelectedValue='<%# Bind("gruppe") %>'>
          <asp:ListItem Value=""></asp:ListItem>
          <asp:ListItem Value="Ambassadør">Ambassadør</asp:ListItem>
          <asp:ListItem Value="Bestyrelsen">Bestyrelsen</asp:ListItem>
          <asp:ListItem Value="Billedredigering">Billedredigering</asp:ListItem>
          <asp:ListItem Value="Introduktionsmøder">Introduktions- og dialogmøder</asp:ListItem>
      </asp:ListBox>

I din codebehind fil skriver du følgende i PageLoad delen:
if (!IsPostBack)
        {
            string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\Privat\\Test\\Database\\TestDB.mdb;";

            OleDbConnection connection = new OleDbConnection(connectionString);
            OleDbCommand command = new OleDbCommand();
            command.Connection = connection;
            connection.Open();

            DataRow r = null;
            DataTable AItems = new DataTable();

            try
            {
                AItems.Columns.Add(new DataColumn("Navn", Type.GetType("System.String")));
                AItems.Columns.Add(new DataColumn("Aktiv", Type.GetType("System.String")));
                command.CommandText = "SELECT * FROM Test";

                //command.Parameters.Clear();
                //command.Parameters.Add(new OleDbParameter("@SessionUserId", SessionUserId));

                OleDbDataReader myReader = command.ExecuteReader();

                //går gennem tabellen og lægger ind i rækker
                while (myReader.Read())
                {
                    r = AItems.NewRow();

                    try
                    {
                        r["Navn"] = (myReader["Navn"]);
                        r["Aktiv"] = (myReader["Aktiv"]);
                    }
                    catch
                    { }

                    //Tilføjer rækken til datatable
                    AItems.Rows.Add(r);
                }

                myReader.Close();
            }
            catch
            { }



            command.Dispose();

            foreach (ListItem i in Gruppe.Items)
            {
                for (int j = 0; j < AItems.Rows.Count; j++)
                {
                    string activatet = Convert.ToString(AItems.Rows[j]["Aktiv"].ToString());
                    string nameId = Convert.ToString(AItems.Rows[j]["Navn"].ToString());

                    if (Convert.ToString(i.Value.ToString()) == nameId)
                    {
                        if (activatet == "True")
                        {
                            i.Selected = true;
                        }
                    }
                }
            }
        }


Jeg regner med, når du ser dette, at du så kan finde ud af at gemme - ellers må du sige til

mvh
simsen :-)
Avatar billede set Nybegynder
27. februar 2008 - 11:46 #4
Du får point, men jeg kan ikke få det til at virke endnu.
Avatar billede set Nybegynder
27. februar 2008 - 11:52 #5
Det der er galt er at i den gamle asp bliver data gemt i et felt der heder gruppe.

altså hvider er valgt flere i listboksen bliver de gemt som f.eks.

bestyrelsen, IT-området tovholder, PR-gruppen

altså det hele i en linie.

Når jeg så henter data igen vises de i første linie i listboksen som selected.

Det er dette jeg ikke kan få til at virke i asp.net. Jeg tror heller ikke det kan lade sig gøre.

Jeg anbringer istedet for en textbox lige ovenfor listboksen til at vise værdien fra databasefeltet.

mange tak for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester