2010-04-23 5 views
3

Je rencontre des problèmes lors de la tentative de remplissage d'une liste déroulante à partir de la base de données. Lorsque j'essaie de définir la source de données, je ne trouve pas le contrôle déroulant, il est dans un DetailsView donc je pense que cela pourrait avoir quelque chose à voir avec elle étant créé seulement quand il est en mode édition. Il dit toujours qu'il est en mode courant quand je suis en train de l'éditer, donc je ne suis pas sûr de ce qui se passe là-bas.Liaison d'une DropDownList dans DetailsView

Voici le code du fichier ASPX:

<asp:DetailsView id="DetailsView1" runat="server" AutoGenerateRows="false" DataSourceID="myMySqlDataSrc" DataKeyNames="id" AutoGenerateDeleteButton="True" AutoGenerateEditButton="True" AutoGenerateInsertButton="False" > 
    <Fields> 
     <asp:TemplateField HeaderText="Region"> 
      <ItemTemplate><%# Eval("region_name") %></ItemTemplate> 
      <EditItemTemplate> 
       <asp:DropDownList ID="RegionDropdownList" runat="server" SelectedValue='<%# Bind("region_id")%>' /> 
      </EditItemTemplate> 
     </asp:TemplateField>   
    </Fields> 
</asp:DetailsView> 

Et ceci est le code sous-jacent:

ArrayList regionsList = BPBusiness.getRegions(); 
if (DetailsView1.CurrentMode == DetailsViewMode.Edit) 
{ 
    DropDownList ddlRegions = (DropDownList)DetailsView1.FindControl("RegionDropdownList"); 
    if (ddlRegions != null) 
    { 
     ddlRegions.DataSource = regionsList; 
     ddlRegions.DataBind(); 
    } 
} 
+0

Quelle méthode fait votre échantillon à partir du code existe derrière dans? –

+0

C'est dans le Page_Load. – annelie

Répondre

3

Si ce n'est déjà fait, placez l'exemple de votre code dans la méthode DetailsView1_ModeChanged ou DetailsView1_DataBound. Si elle est dans la méthode DetailsView1_ModeChanging, le mode n'a pas encore été modifié.

EDIT: Aussi, assurez-vous de mettre en place la DataTextField et DataValueField comme ceci:

DropDownList1.DataTextField = "TextFieldName"; 
DropDownList1.DataValueField = "ValueFieldName"; 

supprimer également la liaison SelectedValue; il ne fait rien sauf jeter des erreurs.

EDIT 2: Si vous avez vraiment besoin de choisir une valeur particulière de la dropdownlist lors de sa première est DataBind, vous pourriez faire quelque chose comme ceci:

if(DropDownList1.Items.Contains(DropDownList1.Items.FindByValue("Value"))) 
{ 
    DropDownList1.SelectedIndex = DropDownList1.Items.IndexOf(DropDownList1.Items.FindByValue("Value)); 
} 
+0

J'ai essayé de le placer dans la méthode DetailsView_DataBound, il génère une erreur sur ma SelectedValue, mais si je l'enlève, la liste peuplé. Bien que seulement avec System.Collections.ArrayList au lieu des valeurs que je voulais donc je suppose que je dois définir les propriétés de texte et de valeur en quelque sorte! :) Je vais essayer de les définir, puis le tester à nouveau avec SelectedValue. – annelie

+0

@annelie Voir mon edit :). –

+0

Merci, je vais essayer ça! J'ai eu un arraylist d'arraylists donc juste besoin de changer cela d'abord. Alors devrait devrait travailler! :) – annelie

2

essayer de le faire dans la méthode ItemCreated

protected void DetailsView1_ItemCreated(object sender, EventArgs e) 
{ 
    ArrayList regionsList = BPBusiness.getRegions(); 
    if (DetailsView1.CurrentMode == DetailsViewMode.Edit) 
    { 
     DropDownList ddlRegions = (DropDownList)DetailsView1.FindControl("RegionDropdownList"); 
     if (ddlRegions != null) 
     { 
      ddlRegions.DataSource = regionsList; 
      ddlRegions.DataBind(); 
     } 
    } 
} 

n'oubliez pas définir OnItemCreated="DetailsView1_ItemCreated"

+0

Merci, cela trouve le contrôle, mais il échoue sur ddlRegions.DataBind() lançant l'erreur "méthodes de liaison de données telles que Eval(), XPath() et Bind() ne peut être utilisé dans le contexte d'un contrôle de databound. ". – annelie

+0

Utiliser DataBinder.Eval (Container.DataItem, "region_name") Méthode Au lieu de Eval ("region_name") – Glennular