ASP.NET ListView не может динамически запускать SelectedIndexChanging - PullRequest
0 голосов
/ 14 ноября 2011
protected void pnlFriends_Click(object sender, EventArgs e)
{
    ClickablePanel pnlFriends = sender as ClickablePanel;
    lvFriends.SelectedIndex = ((ListViewItem)pnlFriends.Parent).DisplayIndex;
}

Не попадает следующее:

protected void lvFriends_SelectedIndexChanging(object sender,  
ListViewSelectEventArgs e)
{
    GetConversation(lvFriends.DataKeys[e.NewSelectedIndex][0].ToString());
}

Как получилось?Я привык работать с WinForms, используя .Selected = true;Однако, похоже, что нет абсолютно никакого способа динамически запустить событие ListViewSelectedIndexChanging.

Есть идеи, как мне заставить это работать должным образом?Спасибо.

РЕДАКТИРОВАТЬ

Я пытаюсь выбрать элемент ListView и при изменении индекса.Я пытаюсь заполнить второй ListView на той же странице.Мне нужно обработать первое событие при изменении индекса.

ОБНОВЛЕНИЕ (РАЗРЕШЕНО)

protected void lvFriends_SelectedIndexChanging(object sender,  ListViewSelectEventArgs e)
{
    lvFriends.SelectedIndex = e.NewSelectedIndex;
    lvFriends.DataSource = Friendship.GetFriends(User.Identity.Name, false);
    lvFriends.DataBind();
    GetConversation(lvFriends.DataKeys[e.NewSelectedIndex][0].ToString());
}

protected void pnlFriends_Click(object sender, EventArgs e)
{
    ClickablePanel pnlFriends = sender as ClickablePanel;
    lvFriends.SelectItem(((ListViewItem)pnlFriends.Parent).DisplayIndex);
}

^ Работает безупречно.Я думаю, как-то. SelectItem вызывает ListViewSelectEventArgs, и мы должны обработать его, установив .SelectedIndex = e.NewSelectedIndex;, а затем повторно связать данные для правильного отображения выбранного элемента.

Теперь, что я могу сделать с кодомвыше просто позвони -> lvFriends.SelectItem(int);

Ответы [ 2 ]

1 голос
/ 14 ноября 2011

Это связано с бизнесом жизненного цикла страницы ASP.Net.Событие "lvFriends_SelectedIndexChanging" и событие "pnlFriends_Click" происходят в одном и том же жизненном цикле.В основном после обратной передачи asp.net проверяет, изменился ли индекс lvlFriends.Это не так, оно продолжается с остальными событиями из постбэка.Теперь это в следующей части жизненного цикла.Он обрабатывает событие "pnlFriends_Click".Это делает обработку для этого.Если случится что-то, что изменит индекс lvlFriends, оно не будет зафиксировано.Жизненный цикл страницы ASP.Net не возвращается после обработки событий из набора элементов управления, чтобы увидеть, не привела ли эта обработка к событиям на других элементах управления.

Но для достижения того, что вы хотите, а не для измененияиндекс или ожидание, чтобы запустить событие.Вам придется явно вызвать метод.

protected void pnlFriends_Click(object sender, EventArgs e)
{
    ClickablePanel pnlFriends = sender as ClickablePanel;
    lvFriends.SelectedIndex = ((ListViewItem)pnlFriends.Parent).DisplayIndex;
    lvFriends_SelectedIndexChanging(lvFriends, new ListViewSelectEventArgs() {// TODO: build the event args object properly});
}
0 голосов
/ 21 ноября 2011
protected void lvFriends_SelectedIndexChanging(object sender,  ListViewSelectEventArgs e)
{
    lvFriends.SelectedIndex = e.NewSelectedIndex;
    lvFriends.DataSource = Friendship.GetFriends(User.Identity.Name, false);
    lvFriends.DataBind();
    GetConversation(lvFriends.DataKeys[e.NewSelectedIndex][0].ToString());
}

protected void pnlFriends_Click(object sender, EventArgs e)
{
    ClickablePanel pnlFriends = sender as ClickablePanel;
    lvFriends.SelectItem(((ListViewItem)pnlFriends.Parent).DisplayIndex);
}

Также, пожалуйста, проверьте оригинальный вопрос!;)

...