You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ListBox中显示UserControl对象?为何自定义UserControl无法显示?

问题原因
  • 当ListBox的DrawMode为默认的Normal时,对于继承自UserControl的对象,ListBox会尝试将其作为控件直接嵌入列表项中,而非调用ToString()输出文本。但ListBox默认布局逻辑不支持直接托管控件作为列表项,导致这类项无法被正确渲染,看起来像是“不显示”。
  • 普通自定义类(比如你的VisibleObject)没有控件特性,ListBox会自动 fallback 到调用ToString()来生成显示文本,因此能正常展示。
解决方法

有三种可行方案,按推荐优先级排序:

方案1:强制ListBox统一以文本模式渲染所有项

修改ListBox的绘制模式为自绘,手动处理所有项的文本绘制逻辑:

// 初始化时配置ListBox
listBox1.DrawMode = DrawMode.OwnerDrawFixed;
listBox1.DrawItem += ListBox1_DrawItem;

// 实现绘制事件处理方法
private void ListBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    e.DrawBackground();
    if (e.Index >= 0 && e.Index < listBox1.Items.Count)
    {
        string displayText = listBox1.Items[e.Index].ToString();
        e.Graphics.DrawString(displayText, e.Font, new SolidBrush(e.ForeColor), e.Bounds);
    }
    e.DrawFocusRectangle();
}

方案2:用包装类托管UserControl对象

创建一个包装类持有UserControl引用,并重写ToString()返回需要显示的文本,将包装类实例添加到ListBox:

public class UserControlWrapper
{
    public InvisibleObject TargetControl { get; set; }
    public override string ToString()
    {
        // 这里可以返回自定义文本,或从UserControl的属性中获取
        return TargetControl.Name ?? "InvisibleObject实例";
    }
}

// 添加列表项时
listBox1.Items.Add(new VisibleObject());
listBox1.Items.Add(new UserControlWrapper { TargetControl = new InvisibleObject() });

方案3:重写UserControl的ToString()(不推荐)

直接在你的InvisibleObject类中重写ToString(),覆盖默认控件的返回值:

public class InvisibleObject : UserControl
{
    public override string ToString()
    {
        return "你想要显示的文本内容";
    }
}

注意:这种方案可能仍受ListBox默认渲染逻辑影响,存在失效风险,仅作为临时替代方案使用。

内容的提问来源于stack exchange,提问作者user7421317

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 22:54:58