0

listboxcontrolログテキストを挿入し、常に最後の行を表示する場所があります

listBoxControl1.SelectedIndex = listBoxControl1.Items.Count - 1;

しかし、ユーザーがリストを上下にスクロールするとき、ユーザーのスクロール位置を維持したいのですが
、これは上記のコードをキャンセルするための条件です。

MouseUp/で試しましMouseDownたが、これらのイベントはクリックしても発生しませんScrollBar

void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        listBoxControl1.Items.Add(e.UserState);
        if (!mouseDown) // this is not working !!
            listBoxControl1.SelectedIndex = listBoxControl1.Items.Count - 1;
    }

ありがとう

4

1 に答える 1

1

次のアプローチを使用できると思います。

SubscribeScrollEvent(listBoxControl1);    // Before start items adding
bw.RunWorkerAsync();
//...
void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
    UnsubscribeScrollEvent(listBoxControl1);  // After items adding complete 
}
void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) {
    listBoxControl1.Items.Add(e.ProgressPercentage);
    if(!userScrollPerformed)
        listBoxControl1.SelectedIndex = listBoxControl1.Items.Count - 1;
}
//...
void SubscribeScrollEvent(ListBoxControl listBox) {
    var hScroll = listBox.Controls[0] as DevExpress.XtraEditors.HScrollBar;
    var vScroll = listBox.Controls[1] as DevExpress.XtraEditors.VScrollBar;
    vScroll.Scroll += ListBox_Scroll;
    hScroll.Scroll += ListBox_Scroll;
}
void UnubscribeScrollEvent(ListBoxControl listBox) {
    var hScroll = listBox.Controls[0] as DevExpress.XtraEditors.HScrollBar;
    var vScroll = listBox.Controls[1] as DevExpress.XtraEditors.VScrollBar;
    vScroll.Scroll -= ListBox_Scroll;
    hScroll.Scroll -= ListBox_Scroll;
}
bool userScrollPerformed;
void ListBox_Scroll(object sender, ScrollEventArgs e) {
    if(e.Type == ScrollEventType.ThumbTrack)
        userScrollPerformed = true; // set a flag
}
于 2013-01-24T14:18:39.573 に答える