【问题标题】:Custom listbox wont display string completly c#自定义列表框不会完全显示字符串c#
【发布时间】:2021-10-02 11:27:43
【问题描述】:

大家好,我正在尝试重新刷列表框中的单个项目,我使用了列表框绘制项目事件,它以某种方式工作,但是当我将项目添加到我的列表框时,只添加了字符串“b”,而不是 +“hi”部分,我可以写任何我想要的或添加任何我想要的,只会打印字符串 b。

不使用绘图模式并坚持使用普通列表框显然可以解决问题,所以我猜它一定与绘图项目事件有关,但我无法弄清楚这究竟是什么,感谢任何帮助

    listBox3.DrawMode = DrawMode.OwnerDrawFixed;

    private async void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        foreach (string b in liIDs)
        {
            listBox3.Invoke((MethodInvoker)delegate
            {
                listBox3.Items.Add(b + "hi");
                listBox3.Update();
            });
        }

    private void listBox3_DrawItem(object sender, DrawItemEventArgs e)
    {
        try
        {
            e.DrawBackground();
            Brush myBrush = Brushes.White;
            myBrush = Brushes.Red;
                
            e.Graphics.DrawString(((ListBox)sender).Items[e.Index].ToString(),
                e.Font, myBrush, e.Bounds, StringFormat.GenericDefault);

            e.DrawFocusRectangle();
        }
        catch
        {

        }
    }

【问题讨论】:

  • 移除无用的 BackgroundWorker(和空的 catch 块)。使用BeginUpdate() / EndUpdate()。可能,将 ListBox.DataSource 设置为您的数据源,而不是一一添加项目——您应该将 Graphics.DrawString() 替换为 TextRenderer.DrawText()
  • ...永远不要使用空的try-catch。

标签: c# .net forms winforms listbox


【解决方案1】:

我只能使用值宽度大于列表框宽度的项目来重现。 如果是这种情况,您需要将 Horizo​​ntalScrollbar 属性设置为 True 和 Horizo​​ntalExtent 值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多