C# 当Form.AutoScroll=true时,PropertyGrid会导致意外滚动

C# 当Form.AutoScroll=true时,PropertyGrid会导致意外滚动,c#,winforms,propertygrid,C#,Winforms,Propertygrid,我的.NET窗体应用程序中的PropertyGrid控件出现问题。 我尝试在AutoScroll属性设置为true的窗体上放置PropertyGrid。 当PropertyGrid位于表单的显示区域内时,就可以了。 但是,当PropertyGrid位于窗体的显示区域之外时,PropertyGrid会导致意外的滚动 我很难用文字描述这个问题。 下面是重现此问题的代码 using System.Drawing; using System.Windows.Forms; namespace Prope

我的.NET窗体应用程序中的PropertyGrid控件出现问题。
我尝试在AutoScroll属性设置为true的窗体上放置PropertyGrid。
当PropertyGrid位于表单的显示区域内时,就可以了。
但是,当PropertyGrid位于窗体的显示区域之外时,PropertyGrid会导致意外的滚动

我很难用文字描述这个问题。
下面是重现此问题的代码

using System.Drawing;
using System.Windows.Forms;

namespace PropertyGridAutoScrollProblem
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            //InitializeComponent();

            Control[] controls = new Control[]
            {
                new TextBox(),
                new RadioButton(),
                new ListBox(),
                new ListView(),
                new PropertyGrid() { SelectedObject = this },
                new DataGridView(),
            };

            var tabControl = new TabControl();
            tabControl.Size = new Size(400, 400);
            tabControl.Location = new Point(50, 50);
            this.Controls.Add(tabControl);

            foreach (var control in controls)
            {
                control.Location = new Point(50, 250);
                control.Size = new Size(200, 100);

                var tabPage = new TabPage(control.GetType().Name);
                tabPage.Controls.Add(control);
                tabControl.Controls.Add(tabPage);
            }

            this.AutoScroll = true;
            this.ClientSize = new Size(400, 200);
        }
    }
}
此程序有一些选项卡。
每个选项卡都包含一个与其选项卡名称相关的控件,该控件位于表单的显示区域之外。
如果单击除“PropertyGrid”之外的任何选项卡,将不会进行滚动。
但如果您单击“PropertyGrid”选项卡,则会发生意外的滚动


最后一个(右下)屏幕截图是在单击“PropertyGrid”之后

有没有办法避免意外的滚动

更新1:

更新2:

@RezaAghaei感谢您的解决方案,但它对我来说并不完美。
我的预期结果是“没有出现滚动”

更新3:

@谢谢你的回复

据我所知,当我们取消选择窗体并再次选择它时,窗体将通过AutoScroll默认行为滚动显示聚焦控件的左上角坐标。
如果单击第二个选项卡,选项卡控件将被聚焦。
我认为这对我来说是很自然的

如果在选择选项卡后单击选项卡页面上的任何控件,则单击的控件将被聚焦,而选项卡控件将失去焦点。

在这种情况下,如果我取消选择表单并再次选择它,表单将滚动显示所单击控件(而不是选项卡控件)的左上角坐标。

问题

所有容器(如
选项卡页
面板
表单
)都会出现这种情况,以查看
属性网格
,其行为是由于构造函数第
259行中的代码造成的:

SetActiveControlInternal(gridView);
解决方案是设置窗体的活动控件,或者在需要滚动到容器到特定位置时

如果同时滚动表单和选项卡页面,则可能需要这两个修复程序

当TabPage滚动时

当您的选项卡页面滚动时,要解决此问题,您可以在所选选项卡更改时滚动到
(0,0)

private void tabControl_SelectedIndexChanged(object sender, EventArgs e)
{
    tabControl.SelectedTab.AutoScrollPosition = new Point(0, 0);
}
当窗体滚动时

如果表单已滚动,您可以再次滚动以显示选项卡页面:

private void tabControl_SelectedIndexChanged(object sender, EventArgs e)
{
    this.ScrollControlIntoView(tabControl);
}
注意

  • 此外,您还可以使用以下方法将此更正限制到您的特定选项卡:
您的预期结果

我认为解决问题取决于布局,对于您的具体情况,我使用以下代码获得您的预期结果:

tabControl.SelectedIndexChanged += (sender, e) =>
{
    if (tabControl.SelectedIndex == 4)
    {
        this.AutoScrollPosition = new Point(0,0);
        tabControl.SelectedTab.AutoScrollPosition = new Point(0, 0);
    }
};
但是我认为使用下面的代码是更自然的解决方案,因为当使用上面的代码时,如果你最小化并恢复窗口,你将得到下面代码的结果

tabControl.SelectedTab.AutoScrollPosition = new Point(0, 0);
this.ScrollControlIntoView(tabControl);

谢谢你的回复。我添加了以下行并尝试了它。但这对我不起作用<代码>tabControl.SelectedIndexChanged+=(s,e)=>tabControl.SelectedTab.AutoScrollPosition=新点(0,0)
@isetaro你是对的,这是因为你的表单滚动,你应该纠正这个问题,所以
tabControl.SelectedIndexChanged+=(s,e)=>这个.scrollControlInView(tabControl)
@isetaro查看编辑后的答案以了解更多信息:)感谢您的解决方案。它似乎消除了这个问题的主要部分。但是,如果窗体显示区域的左上角坐标与选项卡控件的左上角坐标不匹配,则会出现不必要的滚动以匹配这些坐标。对于我的应用程序来说,这种行为可能是一个小问题。@isetaro这篇文章是一个一般性的答案,我认为答案包含了解决问题的主要思路,最终的解决方案可能在某种程度上取决于布局。我相信您可以将解决方案应用到您的布局中。
tabControl.SelectedTab.AutoScrollPosition = new Point(0, 0);
this.ScrollControlIntoView(tabControl);