6

簡単な検索を行った後、この一見単純なことに対する答えが見つかりません。

Asp.Net ListView で項目を手動で選択するにはどうすればよいですか?

SelectedItemTemplate がありますが、asp:button または asp:LinkBut​​ton を使用して項目を選択したくありません。URLからやりたい。たとえば、QueryString のように。

私が想像する方法は、ItemDataBound で条件を確認し、true の場合は選択済みに設定することですが、どうすればよいですか?

例えば:

protected void lv_ItemDataBound(object sender, ListViewItemEventArgs e) {

  using (ListViewDataItem dataItem = (ListViewDataItem)e.Item) {

     if (dataItem != null) {
        if( /* item select condition */ ) {   

            // What do I do here to Set this Item to be Selected?
            // edit: Here's the solution I'm using :
            ((ListView)sender).SelectedIndex = dataItem.DisplayIndex;

            // Note, I get here and it gets set
            // but the SelectedItemTemplate isn't applied!!!

        }
     }
  }
}

1行か2行のコードだと思います。

編集:解決策を反映するようにコードを更新しました。ListView の SelectedItemIndex を選択できるようですが、実際には SelectedItemTemplate をレンダリングしていません。以下に示すように、ItemDataBound イベントでこれを行うべきかどうかはわかりません。

4

4 に答える 4

5

ListViews SelectedIndex を設定できます

list.SelectedIndex = dataItem.DisplayIndex; // don't know which index you need
list.SelectedIndex = dataItem.DataItemIndex; 

アップデート

ページの読み込み時にデータを読み込む場合は、データを走査してインデックスを見つけてから、DataBind() メソッドを呼び出す前に SelectedIndex 値を設定する必要があります。

public void Page_Load(object sender, EventArgs e)
{
  var myData = MyDataSource.GetPeople();
  list.DataSource = myData;
  list.SelectedIndex = myData.FirstIndexOf(p => p.Name.Equals("Bob", StringComparison.InvariantCultureIgnoreCase));
  list.DataBind();
}


public static class EnumerableExtensions
{
    public static int FirstIndexOf<T>(this IEnumerable<T> source, Predicate<T> predicate)
    {
        int count = 0;
        foreach(var item in source)
        {
            if (predicate(item))
                return count;
            count++;
        }
        return -1;
    }
}
于 2009-02-20T18:59:55.107 に答える
3
list.SelectedIndex = list.Items.IndexOf(item);
于 2009-02-20T18:59:29.473 に答える