C# 通过控制(非平滑)滚动面板实现控制

C# 通过控制(非平滑)滚动面板实现控制,c#,winforms,scroll,panel,C#,Winforms,Scroll,Panel,我有一个FlowLayoutPanel,其中包含用户控件以及垂直滚动条 像任何其他可滚动控件一样,我可以逐像素滚动它 是否有一种方法(.NET Framework或本机API方式)通过用户控件滚动它,以便捕捉到下一个或上一个用户控件?它们可以有不同的高度 我想复制DataGridView或Excel/Calc逐行滚动类型。我想回答这个问题-,您期望的行为是不需要的。因此,您可以执行用户在所述问题中所做的操作 您的问题与引用的问题之间的本质区别在于主机控制。您已经使用了FlowLayoutPane

我有一个
FlowLayoutPanel
,其中包含
用户控件
以及垂直滚动条

像任何其他可滚动控件一样,我可以逐像素滚动它

是否有一种方法(.NET Framework或本机API方式)通过
用户控件
滚动它,以便捕捉到下一个或上一个
用户控件
?它们可以有不同的高度

我想复制
DataGridView
或Excel/Calc逐行滚动类型。

我想回答这个问题-,您期望的行为是不需要的。因此,您可以执行用户在所述问题中所做的操作

您的问题与引用的问题之间的本质区别在于主机控制。您已经使用了
FlowLayoutPanel
,并且在引用的问题中使用了
StackPanel

因此,如果您的应用程序是WPF应用程序,您可以将其更改为
StackPanel


在FlowLayoutPanel上使用
WrapContent=True
设置这些属性
AutoScroll=True
是否无效?

快速而肮脏的解决方案

设置
AutoScroll=false
,添加
VScrollBar
,然后输入以下代码:

vScrollBar1.Maximum = MyList.VerticalScroll.Maximum;
vScrollBar1.SmallChange = MyList.VerticalScroll.SmallChange;
vScrollBar1.LargeChange = MyList.VerticalScroll.LargeChange;
vScrollBar1.Scroll += (sender, args) =>
{
    switch (args.Type)
    {
        case ScrollEventType.ThumbTrack:

            var sum = 0;
            Control prevCtrl = null;

            foreach (Control control in MyList.Controls)
            {
                if (prevCtrl == null || control.Bottom > prevCtrl.Bottom)
                {
                    if (args.OldValue >= sum && args.OldValue < sum + control.Height)
                    {
                        MyList.AutoScrollPosition = new Point(0, sum);
                    }

                    sum += control.Height;
                }

                prevCtrl = control;
            }

            break;
    }
}
vScrollBar1.max=MyList.VerticalScroll.max;
vScrollBar1.SmallChange=MyList.VerticalScroll.SmallChange;
vScrollBar1.LargeChange=MyList.VerticalScroll.LargeChange;
vScrollBar1.Scroll+=(发送方,参数)=>
{
开关(参数类型)
{
案例ScrollEventType.ThumbTrack:
var总和=0;
控件prevCtrl=null;
foreach(MyList.Controls中的控件)
{
if(prevCtrl==null | | control.Bottom>prevCtrl.Bottom)
{
如果(args.OldValue>=sum&&args.OldValue
我现在不打算使用WPF(托管控件),除非没有其他解决方案。
AutoScroll=true
WrapContent=false
,以便创建控件列表。如果您知道必要的数量,您不能将其添加到
垂直滚动.Value
(或
水平滚动.Value
)中吗?我可以。问题是当用户使用鼠标滚动面板时,如何防止面板在两个控件之间滚动。