【问题标题】:ComboBox changing style when manually drawing items手动绘制项目时组合框更改样式
【发布时间】:2013-05-01 03:35:42
【问题描述】:

我在这里遇到了一个奇怪的问题,我的组合框正在将其样式从 DropDownList 更改为 DropDown,并且只是在视觉上。检查我的组合框的DropDownStyle 属性显示其设置为DropDownList

基本上这就是我正在做的事情:

void InitComponents()
{
            ddlInterval.DrawMode = DrawMode.OwnerDrawFixed;
            ddlInterval.DrawItem += new DrawItemEventHandler(DrawIntervalItems);
            List<IntervalItem> backupIntervalsList = new List<IntervalItem>();
            IntervalsList.Add(new IntervalItem(5, GetIntervalString(5)));
            IntervalsList.Add(new IntervalItem(15, GetIntervalString(15)));
            IntervalsList.Add(new IntervalItem(30, GetIntervalString(30)));
            IntervalsList.Add(new IntervalItem(60, GetIntervalString(60)));
            IntervalsList.Add(new IntervalItem(120, GetIntervalString(120)));
            IntervalsList.Add(new IntervalItem(240, GetIntervalString(240)));
            IntervalsList.Add(new IntervalItem(480, GetIntervalString(480)));
            IntervalsList.Add(new IntervalItem(720, GetIntervalString(720)));
            IntervalsList.Add(new IntervalItem(1440, GetIntervalString(1440)));
            ddlInterval.DataSource = IntervalsList;
            ddlInterval.DisplayMember = "Name";
            ddlInterval.ValueMember = "Value";
}

 void DrawIntervalItems(object sender, DrawItemEventArgs e)
        {
            if(_bDisableItems)
            {
                switch (e.Index)
                {
                    case 5:
                    case 7:
                    case 8:
                        {
                            string s = ddlInterval.GetItemText(ddlInterval.Items[e.Index]);
                            e.DrawBackground();
                            e.Graphics.DrawString(s, ddlInterval.Font, Brushes.Black, e.Bounds);
                        }
                        break;
                    default:
                        {

                            string s = ddlInterval.GetItemText(ddlInterval.Items[e.Index]);
                            e.Graphics.FillRectangle(SystemBrushes.Window, e.Bounds);
                            e.Graphics.DrawString(s, ddlInterval.Font, Brushes.LightSlateGray, e.Bounds);
                        }
                        break;
                }
            }
        }

这是一张图片,显示了我的两个组合框之间的区别。请注意,两者都将DropDownStyle 设置为DropDownList,但只有底部的项目是手动绘制的:

有没有办法解决这个问题?

【问题讨论】:

  • 您可以使用ComboBoxRenderer 类正确绘制控件。请务必先检查Application.RenderWithVisualStyles。 (编辑:更好的是,像代码示例一样检查ComboBoxRenderer.IsSupported。我忽略了这个属性。)

标签: c# winforms combobox


【解决方案1】:

试试这个代码:

 ddlInterval.DrawMode = DrawMode.Normal;

代替:

 ddlInterval.DrawMode = DrawMode.OwnerDrawFixed;

【讨论】:

  • 如果我将 drawMode 设置为正常,则不会引发 DrawItem 事件
  • 您只为 ddlBackupInterval 设置 DrawItem 事件,而不为 ddlInterval 设置 DrawItem 事件?
  • 抱歉打错了,ddlBackupInterval 和 ddlInterval 是一回事
猜你喜欢
  • 2019-03-07
  • 1970-01-01
  • 2013-04-15
  • 2013-02-15
  • 2011-04-12
  • 2011-08-17
  • 1970-01-01
  • 2021-02-03
  • 1970-01-01
相关资源
最近更新 更多