UIにいくつかのコンボボックスがあり、それぞれに類似したエントリ(番号)の長いリストがあります。ユーザーがコンボボックスの1つからアイテムを選択すると、ユーザーが他のコンボボックスから同様の値(ただし同じではない可能性が高い)のエントリを選択することを私は知っています。したがって、ユーザーが値を選択した後、ユーザーに多くのスクロールを強制しないようにするために、次のコンボボックスのドロップダウンを最後に選択した値の近くに「自動スクロール」したいと思います(このドロップダウンにまだ選択)。理想的には、最後に選択した値がドロップダウンの中央に表示されるようにスクロール位置を設定したいと思います。
これまで、ドロップダウンイベントで選択したアイテムを設定してこれを実行しようとしましたが、これには独自の問題があります。アイテムを選択せずにドロップダウンのスクロール位置を設定する方法はありますか?
これまで私はこれを試しました:
[DllImport("user32.dll", EntryPoint = "SendMessageW", CharSet = CharSet.Unicode)]
private static extern IntPtr SendMessageCb(IntPtr hWnd, int msg, IntPtr wp, out COMBOBOXINFO lp);
[DllImport("user32.dll")]
private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
// P/Invoke declarations
private struct COMBOBOXINFO
{
public Int32 cbSize;
public RECT rcItem, rcButton;
public int buttonState;
public IntPtr hwndCombo, hwndEdit, hwndList;
}
private struct RECT
{
public int Left, Top, Right, Bottom;
}
private const int LVM_FIRST = 0x1000;
private const int LVM_SCROLL = (LVM_FIRST + 20);
private const int WM_VSCROLL = 0x0115;
private const int SB_BOTTOM = 7;
private const int SB_PAGEDOWN = 3;
private void comboBox_DropDown(object sender, EventArgs e)
{
COMBOBOXINFO info = new COMBOBOXINFO();
info.cbSize = Marshal.SizeOf(info);
SendMessageCb((sender as ComboBox).Handle, 0x164, IntPtr.Zero, out info); // seems to work
SendMessage(info.hwndList, WM_VSCROLL, (IntPtr)SB_PAGEDOWN, IntPtr.Zero); // does nothing
SendMessage(info.hwndList, LVM_SCROLL, IntPtr.Zero, (IntPtr) 50); // does nothing
}
しかし、それはうまくいかないようです。COMBOBOXINFO構造は適切に設定されているようですが、SendMessageWM_VSCROLLおよびLVM_SCROLLは効果がありません。