using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace CombBoxXX
{
public partial class DatePickerCustom : UserControl
{
private Button btnNull;
private Button btnOK;
private MonthCalendar Calendar;
private Form FrmCalendar;
private string _dttext;
private Panel panel;
private NumericUpDown num1;
private NumericUpDown num2;
///
/// 供外部调用获取值
///
public string DtText
{ get { return _dttext; } set { _dttext = value; } }
private bool _isshowtime = false;
///
/// 是否要提供时间
///
public bool IsShowTime
{ get { return _isshowtime; } set { _isshowtime = value; } }
public DatePickerCustom()
{
InitializeComponent();
#region 添加个层
panel = new Panel();
panel.Size = new Size(120, 25);
Label lbl1 = new Label();
lbl1.Name = "";
lbl1.Text = "时";
lbl1.Width = 15;
lbl1.Location = new Point(0, 5);
num1 = new NumericUpDown();
num1.Name = "numHour";
num1.Size = new Size(35, num1.Height);
num1.Maximum = 23;
num1.Minimum = 0;
num1.Location = new Point(lbl1.Width + 2, 2);
Label lbl2 = new Label();
lbl2.Name = "";
lbl2.Text = "分";
lbl2.Width = 15;
lbl2.Location = new Point(num1.Location.X + num1.Width + 2, lbl1.Location.Y);
num2 = new NumericUpDown();
num2.Name = "numMinute";
num2.Size = new Size(35, num2.Height);
num2.Maximum = 59;
num2.Minimum = 0;
num2.Location = new Point(lbl2.Location.X + lbl2.Width + 2, num1.Location.Y);
panel.Controls.Add(lbl1);
panel.Controls.Add(num1);
panel.Controls.Add(lbl2);
panel.Controls.Add(num2);
#endregion
this.btnOK = new Button();
this.btnOK.Text = "确定";
this.Calendar = new MonthCalendar();
this.Calendar.Visible = true;
this.Calendar.ShowToday = false;
this.Calendar.ShowTodayCircle = true;
this.Calendar.MaxSelectionCount = 1;
this.Calendar.DateSelected += Calendar_DateSelected;
this.textBoxEx1.Leave += textBoxEx1_Leave;
this.textBoxEx1.EventTextBoxEx_TextChanged += textBoxEx1_EventTextBoxEx_TextChanged;
this.Resize += DatePickerCustom_Resize;
this.btnOK.Click += btnOK_Click;
}
///
/// 确定
///
///
///
void btnOK_Click(object sender, EventArgs e)
{
Calendar_DateSelected(null, null);
}
///
/// 窗体大小发生变化
///
///
///
void DatePickerCustom_Resize(object sender, EventArgs e)
{
this.textBoxEx1.Width = this.Width;
this.Height = this.textBoxEx1.Height;
this.buttonExpand1.Size = new Size(this.textBoxEx1.Height - 2, this.textBoxEx1.Height - 2);
this.buttonExpand1.Location = new Point(this.textBoxEx1.Width - this.buttonExpand1.Size.Width-1,1);
}
public new Font Font
{
get
{
return _Font;
}
set
{
_Font = value;
this.NewFont = value;
}
}
Font _Font = new Font("宋体", 10.5f);
[Category("控件扩展属性"), Description("设置控件中文本字体")]
public Font NewFont
{
get
{
return _Font;
}
set
{
_Font = value;
this.textBoxEx1.Font = _Font;
this.Height = this.textBoxEx1.Height;
this.buttonExpand1.Size = new Size(this.textBoxEx1.Height - 2, this.textBoxEx1.Height - 2);
this.buttonExpand1.Location = new Point(this.textBoxEx1.Width - this.buttonExpand1.Size.Width-1, 1);
Invalidate();
}
}
///
///
///
///
///
void textBoxEx1_EventTextBoxEx_TextChanged(object sender, EventArgs e)
{
this.DtText = this.textBoxEx1.Text.Trim();
if (this.txt_TextChanged != null)
txt_TextChanged(sender, e);
}
#region 定义文本框值更改后触发事件
//定义delegate
public delegate void TextBox_TextChanged(object sender, EventArgs e);
//用event 关键字声明事件对象
///
///
///
[Category("控件扩展事件"), Description("文本框值修改时")]
public event TextBox_TextChanged txt_TextChanged;
#endregion
///
/// 窗体加载事件
///
///
///
private void DatePickerCustom_Load(object sender, EventArgs e)
{
this.buttonExpand1.BackgroundImage = LYFZ.ComponentLibrary.GetUIResources.DateTime;
}
///
/// 点击弹出日期框
///
///
///
private void buttonExpand1_Click(object sender, EventArgs e)
{
if (this.FrmCalendar != null) {
if (!this.FrmCalendar.Visible) {
this.HideWindos();
this.FrmCalendar.Visible = true;
return;
}
this.FrmCalendar.Visible = false;
}
this.btnNull = new Button();
this.btnNull.Text = "空值";
this.FrmCalendar = new Form();
this.FrmCalendar.FormBorderStyle = FormBorderStyle.None;
this.FrmCalendar.TopMost = true;
this.FrmCalendar.Size = new Size(220, 205);
this.FrmCalendar.Controls.Add(this.Calendar);
this.FrmCalendar.Controls.Add(this.btnNull);
this.FrmCalendar.BackColor = this.Calendar.BackColor;
this.Calendar.Dock = DockStyle.Top;
this.FrmCalendar.StartPosition = FormStartPosition.Manual;
this.FrmCalendar.ShowInTaskbar = false;
this.btnNull.Size = new Size(this.FrmCalendar.Width, 25);
this.btnNull.Location = new Point(0, this.Calendar.Location.Y + this.Calendar.Height + 5);
this.btnNull.Click += btnNull_Click;
if (IsShowTime)
{
this.FrmCalendar.Controls.Add(this.btnOK);
this.btnOK.Size = new Size(50, 25);
this.btnOK.Location = new Point(120, this.Calendar.Location.Y + this.Calendar.Height + 5);
this.btnNull.Size = new Size(50, 25);
this.btnNull.Location = new Point(170, this.Calendar.Location.Y + this.Calendar.Height + 5);
panel.Location = new Point(0, this.Calendar.Location.Y + this.Calendar.Height + 5);
this.FrmCalendar.Controls.Add(panel);
}
else
{
this.btnNull.Size = new Size(this.FrmCalendar.Width, 25);
this.btnNull.Location = new Point(0, this.Calendar.Location.Y + this.Calendar.Height + 5);
}
Point pos = this.Location;
pos.Y = pos.Y + this.Height;
pos = this.Parent.PointToScreen(pos);
pos = GetPoint(pos, this.FrmCalendar);
this.FrmCalendar.SetDesktopLocation(pos.X, pos.Y);
this.FrmCalendar.Show();
if (textBoxEx1.Text.ToString().Trim() != "")
{
Calendar.SelectionStart = Convert.ToDateTime(textBoxEx1.Text);
if (IsShowTime)
{
int hh = Convert.ToDateTime(textBoxEx1.Text).Hour;
int mm = Convert.ToDateTime(textBoxEx1.Text).Minute;
num1.Value = hh;
num2.Value = mm;
}
}
this.textBoxEx1.Focus();
}
///
/// 文本框推动焦点时隐藏选择面板
///
///
///
void textBoxEx1_Leave(object sender, EventArgs e)
{
this.DtText = this.textBoxEx1.Text.Trim();
if (this.txt_TextChanged != null)
txt_TextChanged(sender, e);
this.HideWindos();
}
///
/// 选择日期值隐藏当前控件
///
///
///
void Calendar_DateSelected(object sender, DateRangeEventArgs e)
{
string StrDate = this.Calendar.SelectionRange.Start.ToString("yyyy-MM-dd");
if (IsShowTime)
{
string StrHour = "";
string StrMinute = "";
if (this.num1.Value.ToString().Trim().Length > 1)
{ StrHour = this.num1.Value.ToString().Trim(); }
else { StrHour = "0" + this.num1.Value.ToString().Trim(); }
if (this.num2.Value.ToString().Trim().Length > 1)
{ StrMinute = this.num2.Value.ToString().Trim(); }
else { StrMinute = "0" + this.num2.Value.ToString().Trim(); }
this.textBoxEx1.Text = StrDate + " " + StrHour + ":" + StrMinute;
}
this.textBoxEx1.Text = StrDate;
DtText = textBoxEx1.Text;
this.HideWindos();
}
///
/// 空值
///
///
///
void btnNull_Click(object sender, EventArgs e)
{
textBoxEx1.Text = "";
this.Calendar.SelectionStart = this.Calendar.TodayDate;
DtText = textBoxEx1.Text;
this.HideWindos();
}
///
/// 取得指定控件全部显示时的顶点坐标
///
///
///
///
private Point GetPoint(Point sPos, Control ConToShow)
{
Point NewPos = new Point(sPos.X, sPos.Y);
int iConWidth = ConToShow.Width;
int iConHeight = ConToShow.Height;
int iScrWidth = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Width;
int iScrHeight = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height;
if (sPos.Y + iConHeight > iScrHeight)
{ NewPos.Y = iScrHeight - iConHeight; }
if (sPos.X + iConWidth > iScrWidth)
{ NewPos.X = iScrWidth - iConWidth; }
return NewPos;
}
///
/// 供外部调用赋值
///
///
public void TextBoxGiveText(string strText)
{
DtText = strText;
if (DtText != "")
{
if (IsShowTime)
{ DtText = Convert.ToDateTime(DtText).ToString("yyyy-MM-dd HH:mm").Trim(); }
else { DtText = Convert.ToDateTime(DtText).ToString("yyyy-MM-dd").Trim(); }
textBoxEx1.Text = DtText;
}
}
///
/// 供外部调用,隐藏选择面板
///
public void HideWindos()
{
this.FrmCalendar.Hide();
}
}
}