吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 684|回复: 6
收起左侧

[求助] Winform自定义ComboBox控件下拉字异常

[复制链接]
尘缘丶 发表于 2024-4-9 11:11
ComboBox.Text有值的时候下拉列表字显示空白,但点击后又能带入真实的值到Text文本框内
                         空的时候下拉列表字显示的是自定义PlaceHolder内容
N2YH$)G[T$V3CML)FFO1O@4.png FZZB]XJW~597O80GFWD64)K.png

下面上自定义控件代码,我这是用类直接写的(AI写的)。。
[C#] 纯文本查看 复制代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace EnableIE
{
    public class PlaceHolderComboBox : ComboBox
    {
        private string _placeHolder;

        /// <summary>
        /// 占位符文本
        /// </summary>
        public string PlaceHolder
        {
            get { return _placeHolder; }
            set
            {
                _placeHolder = value;
                if (string.IsNullOrEmpty(Text))
                    Text = _placeHolder;
            }
        }

        public PlaceHolderComboBox()
        {
            // 设置绘制模式为固定大小的所有者绘制
            DrawMode = DrawMode.OwnerDrawFixed;

            // 设置背景色为白色
            BackColor = Color.White;

            // 设置前景色为Bold
            this.ForeColor = SystemColors.GradientActiveCaption;
            this.Font = new Font(this.Font, FontStyle.Bold);
        }

        /// <summary>
        /// 在 ComboBox 中绘制项时调用。
        /// </summary>
        /// <param name="e">绘制项事件参数</param>
        protected override void OnDrawItem(DrawItemEventArgs e)
        {
            // 如果索引小于 0,则返回
            if (e.Index < 0)
                return;

            // 如果文本框为空且占位符不为空
            if (string.IsNullOrEmpty(Text) && !string.IsNullOrEmpty(_placeHolder))
            {
                // 绘制占位符文本
                e.Graphics.DrawString(_placeHolder, Font, new SolidBrush(ForeColor), e.Bounds.X, e.Bounds.Y);
            }
            else
            {
                // 否则绘制标准的 ComboBox 项
                base.OnDrawItem(e);
            }
        }

        /// <summary>
        /// 在文本框文本更改时调用。
        /// </summary>
        /// <param name="e">事件参数</param>
        protected override void OnTextChanged(EventArgs e)
        {
            // 调用基类的文本更改事件处理程序
            base.OnTextChanged(e);

            // 如果文本框为空
            if (string.IsNullOrEmpty(Text))
            {
                // 设置文本框文本为占位符
                //Text = _placeHolder;
            }
        }

        /// <summary>
        /// 在文本框获得焦点时调用。
        /// </summary>
        /// <param name="e">事件参数</param>
        protected override void OnGotFocus(EventArgs e)
        {
            // 调用基类的获取焦点事件处理程序
            base.OnGotFocus(e);

            // 如果文本框文本为占位符
            if (Text == _placeHolder)
            {
                // 清空文本框文本
                base.Text = "";
                this.ForeColor = SystemColors.GradientActiveCaption;
                this.Font = new Font(this.Font, FontStyle.Bold);
            }
        }

        /// <summary>
        /// 在文本框失去焦点时调用。
        /// </summary>
        /// <param name="e">事件参数</param>
        protected override void OnLostFocus(EventArgs e)
        {
            // 调用基类的失去焦点事件处理程序
            base.OnLostFocus(e);

            // 如果文本框为空或文本框文本为占位符
            if (string.IsNullOrEmpty(Text) || Text == _placeHolder)
            {
                // 设置文本框文本为占位符
                Text = _placeHolder;
                this.ForeColor = Color.Gray;
                this.Font = new Font(this.Font, FontStyle.Regular);
            }
        }
    }
}

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

头像被屏蔽
gtsarman5 发表于 2024-4-9 13:03
提示: 该帖被管理员或版主屏蔽
flyer_2001 发表于 2024-4-9 16:33
[C#] 纯文本查看 复制代码
if (string.IsNullOrEmpty(Text))
        Text = _placeHolder;
// 这个判断反掉了
flyer_2001 发表于 2024-4-9 17:19
flyer_2001 发表于 2024-4-9 16:33
[mw_shl_code=csharp,true]
if (string.IsNullOrEmpty(Text))
        Text = _placeHolder;

理解错了,请无视
flyer_2001 发表于 2024-4-9 19:27
本帖最后由 flyer_2001 于 2024-4-9 21:16 编辑

[C#] 纯文本查看 复制代码
protected override void OnDrawItem(DrawItemEventArgs e)

这里的判断有问题
改成
[C#] 纯文本查看 复制代码
            // 如果文本框为空且占位符不为空
            if ( !string.IsNullOrEmpty(_placeHolder))
            {
                // 绘制占位符文本
                e.Graphics.DrawString(_placeHolder, Font, new SolidBrush(ForeColor), e.Bounds.X, e.Bounds.Y);
            }
            else
            {
                // 否则绘制标准的 ComboBox 项
                base.OnDrawItem(e);
            }

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
尘缘丶 + 1 + 1 不太对,但还是感谢解答!我已找到解决办法

查看全部评分

 楼主| 尘缘丶 发表于 2024-4-9 22:29

解决办法是不判断文本框或占位符是否为空,直接绘制items.ToString();
代码如下:
[C#] 纯文本查看 复制代码
// 绘制标准的 ComboBox 项
                e.DrawBackground();
                e.Graphics.DrawString(item.ToString(), Font, new SolidBrush(ForeColor), e.Bounds.X, e.Bounds.Y);
                e.DrawFocusRectangle();
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 17:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表