如何在运行时传递ListView的行索引?

时间:2009-03-28 03:23:35

标签: c# .net asp.net .net-3.5

我有一个问题,在我的页面上我有一个ListView控件,我还有一个具有CommandArgument的按钮。我知道我可以在ListView中读取并找到一个控件:

ListView.Items[i].FindControl("controlname");

我在ListView中的按钮就是那个

 asp:Button ID="WisdomButton" runat="server" CommandName="UpdateWisdom"  CommandArgument='<%# need my index for Item[i] to post here %>' 
                                  OnCommand="UpdateWisdom" Text="Update"   />

我想在运行时将索引值添加到CommantParameter中,所以当我转到Function onCommand时,我将确切知道从哪个行[i]我需要从ListView获取我的控件。

所以我的问题是,如何在运行时将ListView.Rows [i]的索引添加到CommmandArgument for Button中?

提前致谢。

2 个答案:

答案 0 :(得分:4)

查看API

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.listviewcommandeventargs.aspx

ListViewCommandEventArgs项目有索引,IE已经在参数中可用

ListViewDataItem dataItem = (ListViewDataItem)e.Item;
int i = dataItem.DisplayIndex;

但是从这里你可以访问这些控件

e.Item.FindConrol("controlName");

如果您以不同的方式调用方法,则可以通过ItemDataBound事件分配索引

void MyListView_ItemDataBound(object sender, ListViewItemEventArgs e)
{
    ((Button)e.Item.FindControl("WisdomButton")).CommandArgument = ((ListViewDataItem)e.Item).DisplayIndex;
}

或者尝试这样的事情来嘻嘻哈哈

<asp:Button runat="server" CommandArgument='<%# DisplayIndex %>'/>
// OR
<asp:Button runat="server" CommandArgument='<%# NextIndex() %>'/>

答案 1 :(得分:0)

了解一下你想做什么可能会有所帮助。如果您的最终目标是从绑定对象获取任何属性,则可以从ItemCommand事件的ListViewCommandEventArgs转换dataItem。您根本不需要保留索引或调用FindControl。

以下是如何获取绑定的Customer对象的示例。

<强>的ListView

<asp:ListView runat="server" id="Customers" ItemCommand="Customers_ItemCommand">
  <LayoutTemplate>
    <ul>
      <asp:placeholder runat="server" id="itemPlaceholder" />
    </ul>
  </LayoutTemplate>
  <ItemTemplate>
    <li>
      <asp:Button runat="server" id="Select" CommandName="Select" />
      <%# Eval("Name")%>
    </li>
  </ItemTemplate>
</asp:ListView>

<强>代码隐藏

public void Page_Load()
{
  if (!Page.IsPostBack)
  {
    this.Customers.DataSource = GetCustomers();
    this.Customers.DataBind();
  }
}

public void Customers_ItemCommand(object sender, ListViewCommandEventArgs e)
{
  if (e.CommandName == "Select")
  {
    if (e.Item.ItemType != ListViewItemType.DataItem)
      return;
    var customer = ((ListViewDataItem)e.Item).DataItem as Customer;
    if (customer != null)
    {
      // Now work directly with the customer object.
      Response.Redirect("viewCustomer.aspx?id=" + customer.Id);
    }
  }
}

编辑:当您将项目转换为ListViewDataItem时,您还会公开((ListViewDataItem)e.Item)。DataItemIndex属性,这可能会对您有所帮助。