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

求助:ComboBox选中项绘制图片后SelectedIndexChanged事件结束丢失

解决ComboBox选中后绘制图片消失的问题

嗨,我明白你遇到的困扰了——在SelectedIndexChanged里画了图片,可控件一刷新就没了对吧?这是因为你找错了绘制的正确时机😉

问题根源

当你把ComboBox设置为DrawMode.OwnerDrawFixed后,控件的所有绘制逻辑都应该放在DrawItem事件里处理,而不是只在SelectedIndexChanged事件里执行一次绘制。SelectedIndexChanged只会在选中项变化时触发一次,但ComboBox在很多场景下会触发重绘(比如窗口被遮挡后恢复、控件获得/失去焦点),这时候之前画的内容会被清空,而你没在重绘时重新绘制图片,自然就消失了。

解决步骤

把绘制逻辑移到DrawItem事件中,每次控件需要重绘时都会执行这里的代码,图片就能持久显示了:

  1. 先绑定DrawItem事件(可以在窗体构造函数或者设计器里添加):
public YourForm()
{
    InitializeComponent();
    comboBox1.DrawItem += ComboBox1_DrawItem;
}
  1. 实现DrawItem事件处理方法,在这里完成图片和文本的绘制:
private void ComboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    // 先绘制背景,避免残留旧内容
    e.DrawBackground();

    // 确保索引有效(防止ComboBox为空时报错)
    if (e.Index >= 0)
    {
        // 绘制ImageList中索引为1的图片,位置可按需调整
        imageList1.Draw(e.Graphics, e.Bounds.Left, e.Bounds.Top, 1);

        // 如果需要显示项的文本,在这里添加(偏移图片宽度避免重叠)
        string itemText = comboBox1.Items[e.Index].ToString();
        e.Graphics.DrawString(
            itemText, 
            e.Font, 
            Brushes.Black, 
            e.Bounds.Left + imageList1.ImageSize.Width + 6, 
            e.Bounds.Top + (e.Bounds.Height - e.Font.Height) / 2 // 让文本垂直居中
        );
    }

    // 绘制焦点框,提升交互体验
    e.DrawFocusRectangle();
}
  1. 移除OnSelectedIndexChanged里的绘制代码,这个事件只用来处理选中变化后的业务逻辑(比如更新其他控件状态)就好,不用管绘制的事。

这样调整后,不管ComboBox怎么刷新,图片都会被重新绘制出来,再也不会消失啦!

内容的提问来源于stack exchange,提问作者Cédric Boivin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:45:22