2009-08-31 67 views
3

也許這件事很容易做到,但到目前爲止,它需要我整天工作。獲取ASP.Net 2.0 Repeater控件中的當前索引

我有一箇中繼器充滿了表。轉發器中的每一行都有一組控件。其中最重要的是具有AutoPostback = true的下拉列表。

當用戶更改所選索引時,此ddl必須回發,以便我可以在ddl內隱藏/顯示控件。

問題是,當用戶更改ddl中的選定索引以及控制回發時,在服務器端,我無法獲取包含回發的ddl的行的索引。

希望它很清楚,並且有人可以幫助我。

謝謝!

編輯: 也許這是一件不太清楚:當我把與ID =「ddlSomething」控制一個ItemTemplate內的中繼器,而我在數據源中有5行,我會在中繼器有5行與5 ddl與相同的ID(在服務器端,在客戶端將是類似於「ctl01 $ ddlSomething」,「ctl02 $ ddlSomething」 我的問題是,當ddl回發,我不知道這5個(例如)ddl中的哪一個是回發的,因爲只要查看Request.Form變量,我就可以看到控件「ddlSomething」創建了它。

回答

5

嘗試:

<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

我不明白Rex ...在哪種情況下會發生這種情況?所有的DDL在服務器端都有相同的ID ...我該怎麼做?我設法得到關於它的一些信息的唯一方法是使用Request.Form變量在Page_load中。 – Sebastian 2009-08-31 20:43:22

+0

@塞巴斯蒂安看到我修改後的答案。 – 2009-08-31 20:49:00

+0

非常感謝雷克斯M,這似乎是最好的事情! – Sebastian 2009-08-31 21:16:32

1

在FormView中,可以做以下,也許它會在代表工作食,以及:

在DDL HTML標記添加屬性的ID到DDL元件:

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

在回發該元素搶ID:

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

編輯:如果員工表中有employee_name,employee_type和employee_id 您可能會打印出員工姓名和員工類型,其中員工類型是全職,兼職等的DLL。 您可以添加此聲明性的y以DLL的標記:

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

,並在DDL回傳:

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

「MyID」在哪裏定義? – 2009-08-31 20:34:00

+0

MyID是您自己的自定義HTML屬性。它不是在任何地方定義的,而是在您的標記中。請記住,儘管此解決方案可行,但由於無法識別的屬性,您將收到HTML驗證錯誤。儘管如此,沒什麼好煩惱的。 – 2009-08-31 20:36:11

+0

我的意思是,DataItem中的「MyID」定義在哪裏? MyID必須是Eval()的DataItem成員才能綁定到它。 – 2009-08-31 20:51:24

0

中繼本身不能告訴你,它控制選擇,因爲您指定的項目模板可能包含控件的任意組合,並且可能沒有辦法將其中的一個指定爲「已選中」

您將不得不檢查中繼器列表中的內部控件。由於您正在創建表格,因此您可以檢查表格的選定索引而不是檢查轉發器的選定索引。

否則,遍歷控件並找到哪個被選中。 例如,您可以通過每一行迭代,並查找發送DDL,這樣的事情:

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

我可能會或可能不會在這裏下車的標誌塞巴斯蒂安,但我相信你想泡的事件。

例如,從你的解釋我是你正在做的事情,如印象:

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

要從中繼器中捕獲一個事件,你可以使用屬性「OnItemCommand」,即:

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

在後面的代碼,你現在能做到以下幾點:

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); 
      } 
     } 

我希望我在這裏沒有走錯路,但我認爲這是你要拍攝的東西。

編輯:

在這裏補充一個小注釋,上面的「e.Item」是有你的事件該行已經燒製而成。因此,您可以完全訪問該行中的其他控件,而不僅僅是您的下拉列表。

+0

我認爲這是一個很好的答案Alexis,謝謝。我稍後再嘗試,但首先需要發貨! :p – Sebastian 2009-08-31 21:17:36

0

將在您的中繼器的拉布勒,並將其綁定,然後在你的DropDownList的的SelectedIndexChanged可以獲取價值如下:

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

問候。

相關問題