面板尺寸限制-解决方法

时间:2019-07-26 22:59:07

标签: c# winforms panel

我有一个用Java开发的小应用程序,我也想用C#构建它。但是我遇到面板尺寸限制。
通过读取文件,我将一些自定义面板作为记录添加到窗体的保持器面板中,并针对该文件中的每一行在我的保持器面板中实例化一个新对象。

在Java中,您可以在JPanel中添加任意数量的对象,它可以使用JScrollPane调整大小并查看其中的所有对象。无论如何,我都有一个内部有1554条记录的文件,而我的Java应用程序将显示所有对象,但是在C#中,由于大小限制,它仅向我显示738条记录。

我尝试将一个面板“ b”添加到该持有人面板,并在该面板b中添加所有记录(自定义面板),并将其高度设置为Int32.MaxValue
我已将BorderStyle设置为FixedSingle,以便能够查看面板b的大小。它使我可以滚动超过Int16.MaxValue,但是我的对象仅显示到该Int16.MaxValue值为止。

唯一的解决方案是分页所有记录?

JPanel with JScrollPane

1 个答案:

答案 0 :(得分:0)

将ListView设置为您显示的控件并不难。
您只需要自己绘制其项的某些部分。

设置:
1. ListView.OwnerDraw = true
2. ListView.View = View.Details
3.添加一列,将ListView的大小减去ScrollBar(SystemInformation.VerticalScrollBarWidth)的大小
4. ListView.HeaderStyle = none,如果您不想显示标题。
5.订阅ListView.DrawSubItem事件
6.添加一个ImageList,将其 ImageSize.Height 设置为ListView的Items高度,然后将其选择为ListView.StateImageList(这样就不会创建自定义控件以定义项目高度的必要条件)。

在这里,我添加了一个实用程序,用于根据“项目”文本的当前对齐方式选择“文本”格式设置样式。如果仅将文本向左对齐,则没有必要。

如果要添加到ListView的项目列表非常长,则可以使用VirtualMode

与您所显示的没什么不同,对吧?

ListView OwnerDraw

Color lvPanelsItemCurrentBackColor = Color.FromArgb(58, 188, 58);
Color lvPanelsItemSelectedBackColor = Color.FromArgb(48, 48, 48);
Color lvPanelsItemBackColor = Color.FromArgb(28,28,28);
Color lvPanelsItemForeColor = Color.White;

private void lvPanels_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
{
    var lView = sender as ListView;
    TextFormatFlags flags = GetTextAlignment(lView, e.ColumnIndex);
    Color itemBackColor = lvPanelsItemBackColor;
    Rectangle itemRect = e.Bounds;
    itemRect.Inflate(-2, -2);

    if (e.Item.Selected || e.Item.Focused) {
        itemBackColor = e.Item.Focused ? lvPanelsItemCurrentBackColor : lvPanelsItemSelectedBackColor;
    }
    using (SolidBrush bkgrBrush = new SolidBrush(itemBackColor)) {
        e.Graphics.FillRectangle(bkgrBrush, itemRect);
    }
    TextRenderer.DrawText(e.Graphics, e.SubItem.Text, e.SubItem.Font, e.Bounds, lvPanelsItemForeColor, flags);
}

private TextFormatFlags GetTextAlignment(ListView lstView, int colIndex)
{
    TextFormatFlags flags = (lstView.View == View.Tile)
        ? (colIndex == 0) ? TextFormatFlags.Default : TextFormatFlags.Bottom
        : TextFormatFlags.VerticalCenter;

    flags |= TextFormatFlags.LeftAndRightPadding | TextFormatFlags.NoPrefix;
    switch (lstView.Columns[colIndex].TextAlign)
    {
        case HorizontalAlignment.Left:
            flags |= TextFormatFlags.Left;
            break;
        case HorizontalAlignment.Right:
            flags |= TextFormatFlags.Right;
            break;
        case HorizontalAlignment.Center:
            flags |= TextFormatFlags.HorizontalCenter;
            break;
    }
    return flags;
}