2009-08-31 9 views
3

Peut-être que c'est quelque chose de très facile à faire, mais jusqu'à présent, ça me prend toute la journée pour que quelque chose fonctionne. J'ai un répéteur rempli d'une table.Obtenir l'index actuel dans un contrôle répéteur ASP.Net 2.0

Chaque rangée dans le répéteur a un ensemble de contrôles. Le plus important d'entre eux est une liste déroulante avec AutoPostback = true.

Ce ddl doit être publié lorsque l'utilisateur modifie l'index sélectionné pour que je puisse masquer/afficher les contrôles dans le ddl. Le problème est que lorsque l'utilisateur change l'index sélectionné dans le ddl, et le contrôle de publication, du côté serveur, je ne peux pas obtenir l'index de la ligne qui contient le ddl qui a fait la publication.

J'espère que c'est assez clair, et que quelqu'un peut m'aider ici.

Merci!

EDIT: Peut-être que cela est quelque chose qui n'a pas été assez clair: lorsque je place un contrôle avec ID = « ddlSomething » à l'intérieur d'un ItemTemplate dans un répéteur, et j'ai 5 lignes dans la source de données, je vais avoir 5 lignes dans le répéteur avec 5 ddl avec le même id (côté serveur, du côté client, il y aura quelque chose comme "ctl01 $ ddlQuelque chose", "ctl02 $ ddlQuelque chose".) Mon problème est que lorsque la publication ddl, je Je ne sais pas lequel de tous ces 5 (par exemple) ddl est celui qui a fait la publication, parce que juste en regardant les variables Request.Form je peux voir que le contrôle "ddlQuelquechose" l'a fait

Répondre

5

Essayez:

<asp:DropDownList runat="server" id="myDDL" OnSelectedIndexChanged="myDDL_Changed" /> 

//fired when the DDL selected index changes 
void myDDL_Changed(object sender, EventArgs e) 
{ 
    //sender is the ddl 
    DropDownList theDropDown = sender as DropDownList; 
    int repeaterItemIndex = ((RepeaterItem)theDropDown.NamingContainer).ItemIndex; 
} 
+0

Je ne comprends pas Rex ... dans quel contexte cela se passe-t-il? Tout le ddl a le même id sur le côté serveur ... comment je fais ça? La seule façon dont je parviens à obtenir des informations à ce sujet est dans le Page_load en utilisant les variables Request.Form. – Sebastian

+0

@Sebastian voir ma réponse révisée. –

+0

Merci beaucoup Rex M, cela semble être la meilleure chose à faire! – Sebastian

1

Dans un FormView vous peut faire ce qui suit, peut-être que cela va fonctionner dans rep mangeurs ainsi:

Dans le balisage DDL HTML ajouter un attribut pour l'ID à l'élément LDD:

MyID='<%# Eval("MyID") %>' 

Dans le postback pour cet élément saisir cet ID:

int intID = Convert.ToInt32((sender as DropDownList).Attributes["MyID"]); 
..... 

EDIT: Si vous avez une table Employees avec employee_name, employee_type et employee_id Vous pouvez avoir arepeater qui affiche le nom de l'employé et le type d'employé où le type d'employé est une DLL avec Temps plein, temps partiel, etc. Vous pourriez ajouter ce declarativel y pour le balisage de la LDD:

MyID='<%# Eval("employee_id") %>' 

et dans le postback LDD:

int employeeID = Convert.ToInt32((sender as DropDownList).Attributes["MyID"]); 
+0

Où "MyID" est-il défini? –

+0

MyID est votre propre attribut HTML personnalisé. Il n'est défini nulle part mais dans votre balisage. Gardez à l'esprit que bien que cette solution fonctionne, vous obtiendrez des erreurs de validation HTML en raison de l'attribut non reconnu. Rien à redire cependant. –

+0

Je veux dire, où est défini "MyID" dans le DataItem? MyID doit être un membre du DataItem pour Eval() pour s'y lier. –

0

Le répéteur lui-même ne peut pas vous dire que le contrôle est sélectionné, parce que la Le modèle d'élément que vous spécifiez peut contenir n'importe quelle combinaison de contrôles et il peut ne pas être possible d'en spécifier un comme 'sélectionné'

Vous devrez vérifier les contrôles internes dans la liste des répéteurs. Puisque vous créez une table, vous pouvez vérifier l'index sélectionné de la table au lieu de vérifier l'index sélectionné du répéteur.

Sinon, parcourez les contrôles et trouvez celui qui est sélectionné. Par exemple, vous pouvez parcourir chaque ligne et rechercher l'envoi DDL, quelque chose comme ceci:

for(...) 
    { 
     if(containingElement.Controls.Find(sender.ID)) 
     { 
     // You found it! 
     } 
     // otherwise keep looking... 
    } 
1

I peuvent ou peuvent ne pas être hors de la marque ici Sebastian, mais je crois que vous essayez d'une bulle un événement.

Par exemple, à partir de votre explication que je suis sous l'impression que vous faites quelque chose comme:

<asp:Repeater id="myRepeater" runat="server"> 
    <ItemTemplate> 
     <asp:DropDownList ID="ddlSomething" AutoPostBack="true" runat="server"></asp:DropDownList> 
    </ItemTemplate> 
</asp:Repeater> 

Pour attraper un événement à l'intérieur du répéteur, vous pouvez utiliser l'attribut « OnItemCommand », à savoir :

<asp:Repeater id="myRepeater" OnItemCommand="SomeEvent_ItemCommand" runat="server"> 
     <ItemTemplate> 
      <asp:DropDownList ID="ddlSomething" AutoPostBack="true" runat="server"></asp:DropDownList> 
     </ItemTemplate> 
    </asp:Repeater> 

Dans votre code derrière, vous êtes maintenant en mesure de faire ce qui suit:

protected void SomeEvent_ItemCommand(object sender, RepeaterCommandEventArgs e) 
     { 
      if (e.CommandSource.GetType() == typeof(DropDownList)) 
      { 
       DropDownList ddlSomething = (DropDownList)e.Item.FindControl("ddlSomething"); 

       //Now you can access your list that fired the event 
       SomeStaticClass.Update(ddlSomething.SelectedIndex); 
      } 
     } 

J'espère ne pas avoir fait fausse route ici, mais je pense que c'est un peu ce que vous recherchez.

EDIT:

Pour ajouter un petit commentaire ici, « e.Item » ci-dessus est la ligne qui a votre événement a été tiré à partir. Vous avez donc un accès complet aux autres contrôles de cette ligne, et pas seulement à votre liste déroulante.

+0

Je pense que c'est une bonne réponse Alexis, merci. Je vais l'essayer plus tard, mais d'abord cela doit être expédié! : p – Sebastian

0

Placez un lable dans votre répéteur et la lier, puis dans votre SelectedIndexChanged de votre DropDownList vous pouvez obtenir la valeur de la manière suivante:

Dim ddl = DirectCast(sender, DropDownList) 
Dim lbl = DirectCast(DirectCast(ddl.NamingContainer,RepeaterItem).FindControl("Label1"),Label) 

Cordialement.

Questions connexes