2009-11-13 3 views
1

J'ai une liste déroulante que je lie à un datatable. Voici le code que je utilise pour le faire:Pourquoi dropdownlist.SelectedIndex = la valeur peut-elle échouer?

ddlBuildAddr.DataSource = buildings 
ddlBuildAddr.DataTextField = "buildingName" 
ddlBuildAddr.DataValueField = "buildingId" 
Dim addressId As Int32 = OfficeData.GetInstance().GetBuildingId(currentAddress) 
ddlBuildAddr.SelectedIndex = addressId 
ddlBuildAddr.DataBind() 

Malheureusement, la ligne ddlBuildAddr.SelectedIndex = addressId échoue. En regardant cette ligne à travers le débogueur, le SelectedIndex va à -1, alors que addressId va à 2. Qu'est-ce qui se passe? Pourquoi l'opérateur d'affectation ne fonctionnerait-il pas?

Répondre

5

Déplacez votre ddlDeptName.DataBind() pour avant d'essayer de définir l'index sélectionné. Avant de lier, vous n'avez aucun élément dans la liste déroulante, donc un index de 2 est invalide.

+0

Erreur stupide, vous avez raison! Cependant, l'état selectedindex ne change pas. –

+1

Avez-vous vérifié que la liste déroulante est réellement remplie de quelque chose? Essayez de commenter la ligne pour définir l'index et vérifiez que des éléments sont chargés dans la liste. En outre, comme d'autres l'ont suggéré, vous souhaitez probablement définir la propriété SelectedValue. – TLiebe

+0

Oui c'est. Je l'ai fait et tout est bien rempli :) –

0

Je pense que vous devez définir la propriété au lieu SelectedValue.

+0

SelectedValue renvoie une chaîne vide. –

1

Remplacer cette ligne

ddlDeptName.SelectedIndex = addressId 

Avec ceci:

ddlDeptName.SelectedValue = addressId.ToString() 

Quant à savoir pourquoi il est à défaut - AddressID est probablement hors de la gamme des possibles index valeurs de votre liste déroulante.

+0

enlever le ToString fait en quelque sorte ce travail. Merci –

+0

Si vous prenez le ToString, vous venez avec exactement la même chose que je suggère, que vous avez dit qu'il ne fonctionnait pas ... hein? – Konamiman

0

comme TLiebe a souligné, déplacez votre DataBind à avant d'essayer de régler le sélectionné. la méthode de liaison de données efface fondamentalement tout état précédent que vous avez défini sur la zone de liste déroulante.

secondes, l'index sélectionné ne correspond pas au datavalue ou les membres de la valeur sélectionnée. il s'agit de l'index de ListItem dans la collection d'éléments du menu déroulant de sorte que dropdown [dropdown.selectedindex] vous donne l'élément de la liste marquée comme sélectionné. Vous devez donc rechercher l'élément que vous voulez sélectionner, puis définir l'index sélectionné sur l'index de cet élément.

un exemple VB de MSDN:

' Selects the item whose text is Apples 
ListBox1.Items.FindByText("Apples") 
If Not li Is Nothing Then 
    li.Selected = True 
End If 

// Selects the item whose text is Apples 
ListItem li = ListBox1.Items.FindByText("Apples"); 
if(li != null) 
{ 
    li.Selected = true; 
} 
0

Utilisez cette

ddlBuildAddr.DataSource = buildings 
ddlBuildAddr.DataTextField = "buildingName" 
ddlBuildAddr.DataValueField = "buildingId" 
Dim addressId As Int32 = OfficeData.GetInstance().GetBuildingId(currentAddress) 

ddlBuildAddr.Databind() 

Après

foreach (var item in ddlBuildAddr.Items) 
{ 
    if(Convert.toInt32(item.value)==addressId) 
    { 
    item.selected=true; 
    break; 
    } 
} 
0

Modifier votre code comme suit ....

ddlBuildAddr.DataSource = buildings 
ddlBuildAddr.DataTextField = "buildingName" 
ddlBuildAddr.DataValueField = "buildingId" 
ddlBuildAddr.DataBind() 

Dim addressId As Int32 = OfficeData.GetInstance().GetBuildingId(currentAddress) 

ddlBuildAddr.SelectedValue = addressId //It may throw error if item is not found in the list 
(or) 
ddlBuildAddr.Items.FindByValue(addressId).Selected = true; 
(or) 
ListItem lstNew = ddlBuildAddr.Items.FindByValue(addressId) 
ddlBuildAddr.selectedItem = lstNew 
+0

la propriété .selecteditem est en lecture seule :) –

Questions connexes