TabControl - Autoscroll无法正常工作

时间:2015-06-25 11:38:55

标签: c# winforms tabcontrol autoscroll

我有以下问题,我正在创建一个带有几个TabPages的TabControl,TabPages中的内容是动态生成的,所以我决定让Autoscroll = true。当我现在在选项卡上更改时,我首先必须按下文本框或复选框,我可以滚动,这真的很烦人。当我更改标签时,当滚动功能立即激活时会更好。我尝试了一些具有焦点的东西,但它没有改变任何东西。

 TabControl tc = new TabControl();
                tc.TabPages.AddRange(new TabPage[]
                {
                new TabPage("Noten 2015"),
                new TabPage("Noten 2014"),
                new TabPage("History 2013-2010"),
                new TabPage("Sonstiges")});
    }


            for (int i = 0; i <= 3; i++)
            {
                tc.TabPages[i].AutoScroll = true;       
            }

1 个答案:

答案 0 :(得分:1)

投诉含糊不清,操作滚动条肯定不会有任何问题。我不得不猜测你的真正问题与鼠标滚轮有关。鼠标滚轮消息将发送到具有焦点的控件。单击选项卡时,TabControl将是哪个。它对滚动消息没有任何用处,它是实现滚动的客户端选项卡页面。

因此,您正在寻找的可能解决方法是在选择选项卡后立即将焦点移动到选项卡页面内的控件。为SelectedIndexChanged事件实现事件处理程序:

    private void tabControl1_SelectedIndexChanged(object sender, EventArgs e) {
        var page = tabControl1.SelectedTab;
        page.SelectNextControl(page, true, true, true, true);
    }

然而,这不是一个完美的解决方案,当您使用Tab键或光标键导航到选项卡控件时,它仍然无法正常工作。或者,如果标签页没有任何可以获得焦点的控件。更通用的解决方案需要更多手术,您需要将鼠标滚轮消息从选项卡控件转发到活动标签页。在项目中添加一个新类并粘贴下面显示的代码。编译。将新控件从工具栏顶部拖到窗体上,替换现有窗口。

using System;
using System.Windows.Forms;

class TabControlEx : TabControl {
    private bool recurse;
    protected override void WndProc(ref Message m) {
        const int WM_MOUSEWHEEL = 0x20a;
        if (!recurse && m.Msg == WM_MOUSEWHEEL && this.SelectedTab != null) {
            recurse = true;
            SendMessage(this.SelectedTab.Handle, m.Msg, m.WParam, m.LParam);
            recurse = false;
            m.Result = IntPtr.Zero;
            return;
        }
        base.WndProc(ref m);
    }
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
}