2011-08-02 6 views
0

J'ai créé une application asp.net qui remplit une table avec des informations à partir d'une base de données, choisissez une valeur dans une liste déroulante et mettre à jour la base de données. Pour une raison quelconque maintenant, quand je vais à la date suivante et toutes les informations s'affichent correctement, mais la valeur dans la liste déroulante ne fonctionne pas. Pour cette raison, disons que la première page a 3 lignes et la deuxième page a 10. Les 3 premières lignes sur la deuxième page auront la même valeur dans la liste déroulante que la page précédente, tout le reste est changé cependant. Voici le code utilisé pour créer la liste déroulante sur chaque ligne:Liste déroulante ne pas effacer

tc = new TableCell(); 
        tc.BorderWidth = 1; 
        String rteNum = reader.GetValue(fCount - 1).ToString().TrimStart('R'); 

        //this output displays the correct value 
        System.Diagnostics.Trace.WriteLine(rteNum.Trim()); 

        ddl = new DropDownList(); 
        ddl.ID = "route" + index; 
        ddl.Attributes["runat"] = "server"; 
        ddl.Attributes["onblur"] = "refresh()"; 

        ListItem item; 
        for (int i = 1; i <= 32; i++) 
        { 
         item = new ListItem(); 
         item.Text = i.ToString(); 
         item.Value = i.ToString(); 
         if (i.ToString().Equals(rteNum.Trim())) 
         { 
          item.Selected = true; 
         } 
         ddl.Items.Add(item); 

        } 
        list.Add(ddl); 

        tc.Controls.Add(ddl);    
        tc.ID = "tblr" + index; 
        tr.Cells.Add(tc); 

        tbl1.Rows.Add(tr); 

EDIT:

Le problème est que je dois utiliser les valeurs modifiées si l'utilisateur appuie sur un bouton, mais lorsque les données sont changé l'information doit être abandonnée. Donc, fondamentalement, j'ai besoin d'afficher les informations avec une liste déroulante puis mettre à jour la base de données.

+0

La ligne "ddl.Attributes [" runat "] = "server";" ne fait rien car il envoie juste cet attribut au client. Vous n'avez pas besoin d'ajouter runat lorsque vous créez le contrôle à la main. –

Répondre

0

Une façon est de le faire en marge comme ceci:

<asp:DropDownList ID="ddl_1" runat="server" AutoPostBack="True" 
    DataSourceID="ds_1" DataTextField="myText" 
    DataValueField="myValue" /> 

    <asp:SqlDataSource ID="ds_1" runat="server" 
     ConnectionString="<%$ ConnectionStrings:myConnection %>" 
     <!--this is if you use a stored procedure--> 
     SelectCommand="dbo.myProcedure" SelectCommandType="StoredProcedure"> 
     <!--this is if you use direct sql (less secure -- be careful with parameters)--> 
     SelectCommand="SELECT field1 as myValue, field2 as myText FROM myTable"> 
    </asp:SqlDataSource> 

Ainsi, lorsque vous souhaitez définir la valeur sélectionnée sur la base d'une valeur de base de données (en réponse à un bouton-clic, etc., vous pouvez utiliser un sous comme ceci dans votre code-behind:

Private Sub SELECT_whatever() 
     Dim myCommand As New SqlCommand("dbo.SELECT_whatever", myConnection) 
     With myCommand 
      .CommandType = CommandType.StoredProcedure 
      With .Parameters 
       .Clear() 
       .AddWithValue("myParameter", me.txtwhateverfield.text) 
      End With 
     End With 
     Try 
      myConnection.Open() 
      myReader = myCommand.ExecuteReader 
      While myReader.Read 
       If Not IsDBNull(myReader("field1")) Then 
        Me.ddl_instructor.SelectedValue = myReader("field1") 
       End If 
       Me.lbl_RecordID.Text = "Record ID: " & myReader("recordID") 
       -- etc. -- for all of the textboxes, labels, etc. on your page 
      End While 
     Catch ex As Exception 
      Response.Write(ex.Message) 
     Finally 
      myConnection.Close() 
     End Try 

comme alternative à l'utilisation d'un contrôle datasoruce en marge, vous pouvez utiliser le sous ci-dessus, mais ...

  1. créer un ensemble de données
  2. créer un adaptateur de données
  3. appel .Remplir sur l'adaptateur de données pour une table dans l'ensemble de données
  4. définir la source de données de liste déroulante à la table de données
  5. appel .databind () dans la liste déroulante.

Voici un exemple: http://support.microsoft.com/kb/306574 (CTRL + F pour "DataBind" - il est dans le point 4)

0

Il semble que vous attendiez l'un de vos 32 option éléments dans votre DropDownList à sélectionner. Soupçonnez que rteNum.Trim() n'a pas la valeur exacte de 1 à 32.

Pour déboguer cela, essayez de déterminer la valeur de rteNum

//pre-trim this val. 
string rteNum = reader.GetValue(fCount - 1).ToString().TrimStart('R').Trim(); 
... 

ddl.Attributes["name"] = rteNum; //a random place/attr show the value of rteNum 
ddl.Attributes["runat"] = "server"; 
ddl.Attributes["onblur"] = "refresh()"; 
.... 
item.Value = i.ToString(); 
item.Selected = (i.ToString()==rteNum); 

Voir votre source après la page rend pour trouver la valeur de votre L'attribut de nom de DropDownList. Comparez cela contre 1-32.

0

de ne pas critiquer, mais comme une observation ...

que vous faites beaucoup de travail pour remplir, et puis aussi pour synchroniser votre liste déroulante. Vous n'avez pas besoin d'utiliser un lecteur de données comme intermédiaire. Vous pourriez simplement aller directement à la source de données. L'appel de databind() peut remplir la liste, au lieu de faire une insertion ligne par ligne à partir de votre lecteur de données.

Si vous êtes intéressé par cette approche, je peux mettre en place un exemple de code.

Sinon, comme le dit @ p.cambell, comme vous le faites actuellement, votre propriété sélectionnée n'est définie que lorsque rteNum a une valeur.

+0

rteNum a toujours une valeur. J'aimerais voir un exemple de databind() si vous pouviez le mettre en place pour moi. – user776530

+0

OK - fera .. – Chains

Questions connexes