1

我正在寻找像微软提供的那样的日期选择器,但它不支持空值,因为这与数据库上的一个可以为空的字段相关联,这是不可接受的。

我找到了这个,但根据页面底部的评论,它在绑定到数据库时存在问题。我的项目中也有一个我继承的,但它有类似的问题(有时它显示值,有时它不显示)。有谁知道一个有效的?

4

4 回答 4

4

使用日期选择器填充文本框,如果他们希望该字段为空,只需擦除文本框的内容(然后相应地处理空白输入)。

这还提供了额外的好处,即允许用户输入他们的日期,如果他们愿意的话。

于 2009-05-14T20:45:32.243 回答
1

Smart FieldPackEditor 有一个可以为空的日期选择器。我相信它可以满足您的一切需求。当我处理这类事情时,我希望它就在身边。我仍然记得我必须使用 Microsoft 的 datepicker 控件实现的所有变通方法。啊!

http://www.visualhint.com/index.php/fieldpackeditor/

于 2009-05-14T20:46:13.600 回答
-2

为什么不使用客户端日期选择器来填充文本字段。如果文本字段为空,则您的日期为空,否则转换该值。

jQuery 有一个很好用的日期选择器。http://jqueryui.com

于 2009-05-14T20:36:12.657 回答
-3

这个似乎有效,我的一位同事有它:

using System;
using System.Windows.Forms;

namespace CustomControls
{
    public class NullableBindableDateTimePicker : System.Windows.Forms.DateTimePicker
    {
        private Boolean isNull = false;
        private DateTimePickerFormat baseFormat = DateTimePickerFormat.Short;
        private Boolean ignoreBindOnFormat = false;

        public NullableBindableDateTimePicker()
        {
            this.Format = baseFormat;
            if (baseFormat == DateTimePickerFormat.Custom) this.CustomFormat = " ";
        }

        public Boolean IsNull
        {
            get { return isNull; }
            set
            {
                isNull = value;
                this.Checked = value;
            }
        }

        //TODO: Add BaseCustomFormat

        public DateTimePickerFormat BaseFormat
        {
            get { return baseFormat; }
            set { baseFormat = value; }
        }

        public object BindMe
        {
            get
            {
                if (IsNull) return System.DBNull.Value;
                else return base.Value;
            }
            set
            {
                //String s = this.Name;

                if (ignoreBindOnFormat) return;

                if (System.Convert.IsDBNull(value))
                {
                    // for some reason setting base.format in this.format calls set BindMe.
                    // we need to ignore the following call
                    ignoreBindOnFormat = true;
                    this.Format = DateTimePickerFormat.Custom;
                    ignoreBindOnFormat = false;

                    this.CustomFormat = " ";
                    IsNull = true;
                }
                else
                {
                    ignoreBindOnFormat = true;
                    this.Format = baseFormat;
                    ignoreBindOnFormat = false;

                    if (baseFormat == DateTimePickerFormat.Custom) this.CustomFormat = " ";
                    IsNull = false;
                    base.Value = (DateTime)value;
                }
            }
        }

        protected override void OnKeyDown(KeyEventArgs e)
        {
            base.OnKeyDown(e);

            if (e.KeyCode == Keys.Delete)
            {
                this.BindMe = DBNull.Value;
            }
        }

        protected override void OnCloseUp(EventArgs eventargs)
        {
            base.OnCloseUp(eventargs);
            BindMe = base.Value;
        }
    }
}
于 2009-05-14T20:55:59.927 回答