我有一个基于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,我会遇到同样的问题。
答案 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();