C# 我可以通过水平滚动条从ListView的总列宽中获取可见列宽吗

C# 我可以通过水平滚动条从ListView的总列宽中获取可见列宽吗,c#,.net,winforms,C#,.net,Winforms,我有一个以视图作为详细信息的列表视图&其中一列有用于编辑每行数据的组合框 当我调整列的大小时,我在表单中的ListView中得到了一个水平滚动条。假设我移动第二列时,列的一半是可见的&只有当向右拖动滚动条时,列的一半才可见 我能以任何方式获得ListView的可见列宽吗 Rgards是的,您可以通过编程逐步浏览列表视图中的每一列,并获取其宽度 然后,您可以通过使用每个列的宽度和listview本身的宽度来计算列的可见区域 这是工作代码。我让它非常简单,以显示步骤。您可以根据自己的使用情况对其进行

我有一个以视图作为详细信息的列表视图&其中一列有用于编辑每行数据的组合框

当我调整列的大小时,我在表单中的ListView中得到了一个水平滚动条。假设我移动第二列时,列的一半是可见的&只有当向右拖动滚动条时,列的一半才可见

我能以任何方式获得ListView的可见列宽吗


Rgards

是的,您可以通过编程逐步浏览
列表视图中的每一列,并获取其宽度

然后,您可以通过使用每个列的宽度和listview本身的宽度来计算列的可见区域

这是工作代码。我让它非常简单,以显示步骤。您可以根据自己的使用情况对其进行优化

        Dim totalWdith As Integer = SOlistview.Width
        Dim combinedColumnWidth As Integer = 0
        Dim visibleSpaceLeft As Integer = 0

        Dim columnCount As Integer = SOlistview.Columns.Count
        Dim weHaveClipping As Boolean = False

        For i = 0 To columnCount - 1

            If combinedColumnWidth + SOlistview.Columns(i).Width > totalWdith Then

                '//we will have clipping occur if we add this column...

                visibleSpaceLeft = SOlistview.Width - combinedColumnWidth
                weHaveClipping = True
                Exit For

            Else

                '//no clipping yet, so add this column to my math

                combinedColumnWidth += SOlistview.Columns(i).Width

            End If

        Next

        Dim myDropDown As New ComboBox

        If weHaveClipping Then
            myDropDown.Top = e.Y - myDropDown.Height
            myDropDown.Left = combinedColumnWidth
            myDropDown.Width = visibleSpaceLeft
        Else
            '//run your normal code to place the combobox....
        End If


        SOlistview.Controls.Add(myDropDown)
您还可以修改它,使其仅显示一个宽度,然后在需要时使用计算的可见宽度(如在发生的滚动、鼠标单击等)


我建议您使用TableLayoutPanel来获得更多机会。

分享您需要的图片可能会有更多帮助。我以为您指的是最后一列的可见宽度。要获得任何列的可见宽度,必须知道滚动的数量,或者可能插入到绘图事件中。。。我稍后再玩,但不要屏息以待..嗨,请记住将相关答案标记为已接受。谢谢路易斯…但我如何计算?我的意思是在ListView_MouseUp事件中,我正在检查ListViewItem.SubItems[1]。宽度,但它会得到该列的总宽度,而不是可见宽度。如果你能帮我完成示例代码,那会很有帮助。我现在不在开发人员的电脑上,但可以测量listview的宽度,-(减去)从第一列到最后一列被剪裁的组合宽度。一个更有趣的问题是,你想实现什么?为什么要查找可见宽度?实际上,每当用户单击任何ListViewItem时,我都会在ListView\u MouseUp事件的该列中放置一个Combobox控件。我正在计算所选ListViewItem各自的列宽并将其分配给Combobox.Bounds,这在没有滚动条的情况下运行良好。但是当出现水平滚动条时,这是失败的,因为ComboBox实际上不是ListView控件的一部分,ComboBox不会随ListView自动滚动。下面是我执行的文章。我明白了,现在它更有意义了。
        private function _get_clippedColumn_visible_width() as int16

        Dim totalWdith As Integer = SOlistview.Width
        Dim combinedColumnWidth As Integer = 0
        Dim visibleSpaceLeft As Integer = 0

        Dim columnCount As Integer = SOlistview.Columns.Count
        Dim weHaveClipping As Boolean = False

        For i = 0 To columnCount - 1

            If combinedColumnWidth + SOlistview.Columns(i).Width > totalWdith Then

                '//we will have clipping occur if we add this column...

                visibleSpaceLeft = SOlistview.Width - combinedColumnWidth
                weHaveClipping = True
                Exit For

            Else

                '//no clipping yet, so add this column to my math

                combinedColumnWidth += SOlistview.Columns(i).Width

            End If

         Next

         return visibleSpaceLeft 

        End Function