2011-11-08 64 views
1

如果我有以下ListView,我如何將SelectedIndexChanged事件偵聽器附加到DropDownList,以便我可以對各個對象執行命令?想象一下,我有一個新用戶列表,我想通過從DropDownList中選擇組來添加他們到一個用戶組。訪問控件內部ASP.NET視圖控件(事件處理)

<asp:ListView ID="NewUsers" runat="server" DataSourceID="NewUsersSDS" DataKeyNames="ID"> 
    <LayoutTemplate> 
     <asp:Table ID="groupPlaceholder" runat="server"><asp:TableRow></asp:TableRow></asp:Table> 
    </LayoutTemplate> 
    <GroupTemplate> 
     <asp:TableCell ID="itemPlaceholder" runat="server"></asp:TableCell> 
    </GroupTemplate> 
    <ItemTemplate> 
     <asp:Table ID="NewUsersTable" runat="server" Width="32%" CssClass="inlineTable"> 
      <asp:TableRow> 
       <asp:TableCell Width="100px"><%# Eval("FullName").ToString.Trim()%></asp:TableCell> 
       <asp:TableCell> 
        <asp:HiddenField ID="RowIndex" runat="server" Value="<%# Container.DisplayIndex %>" /> 
        <asp:DropDownList ID="UserGroupSelect" runat="server" DataSourceID="UserGroupSelectSDS" DataValueField="ID" DataTextField="UserGroup" 
         OnSelectedIndexChanged="UserGroupSelect_SelectedIndexChanged" AutoPostBack="True"> 
        </asp:DropDownList> 
       </asp:TableCell> 
      </asp:TableRow> 
     </asp:Table> 
    </ItemTemplate> 
</asp:ListView> 

我一直在訪問__View控件內部控件的問題。我在幾個地方看過,你可以通過NewUsers.FindControl([ControlID as String])訪問它們,但這似乎不適合我。我想這就是所謂的動態控制?不太確定,感覺有點失落。

與往常一樣,您的幫助非常感謝。 ;)

附加信息/代碼

'Now working code, thanks to James :) 
Protected Sub ItemBind(ByVal sender As Object, ByVal e As ListViewItemEventArgs) Handles NewUsers.ItemDataBound 
    Dim lv As ListView = DirectCast(sender, ListView) 
    If e.Item.ItemType = ListViewItemType.DataItem Then 
     lv.DataKeys(e.Item.DataItemIndex).Value.ToString() 'get the datakey 
    End If 
End Sub 
    Protected Sub UserGroupSelect_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) 
    Dim RowIndex As Integer = CInt(DirectCast(DirectCast(sender, DropDownList).Parent.FindControl("RowIndex"), HiddenField).Value) 
    Dim pk As Integer = CInt(NewUsers.DataKeys(RowIndex)("ID")) 
    Try 
     MessageBox("Update key " + pk.ToString, "Update Key") 'Custom js "alert" box function 
    Catch ex As Exception 
     MessageBox("Something went wrong, is the update key empty?") 
    End Try 
End Sub 

回答

2

要訪問一個ListView(或任何數據綁定控件控件),您需要在項目/行使用FindControl

ListViewItem item = ListView1.Items[0]; 
if (item != null) 
{ 
    DropDownList ddl = item.FindControl("DropDownList1") as DropDownList; 
    if (ddl != null) 
    { 
     string value = ddl.SelectedValue; 
    } 
} 

至於附加SelectedIndexChanged事件,你可以這樣做:

<ItemTemplate> 
    <asp:DropDownList ID="DropDownList1" runat="server" 
     AutoPostBack="true" 
     OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged"> 
    </asp:DropDownList> 
    <asp:HiddenField ID="HiddenField1" runat="server" Value='<%# Container.DisplayIndex %>' /> 
</ItemTemplate> 

代碼隱藏:

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    int rowIndex = Convert.ToInt32(((HiddenField)((DropDownList)sender).Parent.FindControl("HiddenField1")).Value); 

    ListViewItem item = ListView1.Items[rowIndex]; 
    if (item != null) 
    { 
     //your logic here 
    }   
} 

要檢索datakey:

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    int rowIndex = Convert.ToInt32(((HiddenField)((DropDownList)sender).Parent.FindControl("HiddenField1")).Value); 

    int pk = (int)ListView1.DataKeys[rowIndex]["PrimaryKey"];  
} 
+0

嗯,那麼,這是否代碼頂塊去了?在ListView的'ItemDataBound'事件裏面?因爲'DropDownBox'控件當然沒有'ItemCommand'屬性。我仍然無法正常工作。在我嘗試了更多的想法之後,我會稍微發佈一些代碼。 – Chiramisu

+0

是的,'ItemDataBound'對它來說是個好地方。顯然,你不需要獲得'ListViewItem'的部分,因爲你已經擁有它了。 –

+0

對不起,您需要添加'AutoPostBack =「true」' –