CheckedListBox水平滚动条不允许我查看所有文本

时间:2015-10-20 13:20:26

标签: c# .net winforms horizontal-scrolling checkedlistbox

我有一个基于CheckedListBox的自定义控件

public CustomCheckedListBox : CheckedListBox
{
    public void AddItems(CustomCollection MyCollection)
    {
        foreach(var C in MyCollection.Items)
        {
             // Some logic is here to determine if an item should be added.
             this.Items.Add(C);    // The C object has a string overload
        }
    }
}

当此控件与某些长文本一起使用时,水平滚动条似乎没有正确调整大小。当我向右滚动时,文本被切断。

如果我清除了Items集合并在加载控件后再次写入其内容,则水平滚动条的大小正确。

知道可能导致这种情况的原因吗?

如果只使用标准的CheckedListBox,我会遇到同样的问题。

在红线上,最后约有5个字符丢失。它适用于所有字符类型。

1 个答案:

答案 0 :(得分:0)

ListBox实现中似乎存在一个错误,使用不同的项目文本宽度测量方法,这会导致您遇到的行为。

要解决此问题,您可以使用以下帮助程序(警告:使用ListBox私有实施成员)

using System;
using System.Linq.Expressions;
using System.Windows.Forms;

namespace Samples
{
    public static class ListBoxUtils
    {
        public static void UpdateHorizontalScrollbar(this ListBox target)
        {
            updateHorizontalScrollbarFunc(target);
        }
        private static readonly Action<ListBox> updateHorizontalScrollbarFunc = CreateUpdateScrollbarFunc();
        private static Action<ListBox> CreateUpdateScrollbarFunc()
        {
            var target = Expression.Parameter(typeof(ListBox), "target");
            var body = Expression.Block(
                Expression.Assign(Expression.Field(target, "maxWidth"), Expression.Constant(-1)),
                Expression.Call(target, "UpdateHorizontalExtent", null)
            );
            var lambda = Expression.Lambda<Action<ListBox>>(body, target);
            return lambda.Compile();
        }
    }
}

修改项目集合后,只需调用

即可
listBox.UpdateHorizontalScrollbar();