[英]C# DateTimePicker
我有一个带有DateTimePicker控件的WinForm,它显示SQL数据库中的特定日期。
当用户单击它时,我将打开一个自定义表单,询问他们是否确定要更改日期。
如果单击“确定”,则可以使用DateTimePicker继续更改日期,并将更改发布回我的SQL Server数据库中。
如果用户单击“取消”,则该方法将退出,因此不会将任何更改保存到数据库。
但是,令我烦恼的是,即使用户单击“取消”,DateTimePicker下拉日历仍保持打开状态,用户可能会将其解释为未能取消的动作。 如何获取DateTimePicker以关闭打开的下拉日历?
private void datDOA_ValueChanged(object sender, EventArgs e)
{
frmConfirmBox frmCB = new frmConfirmBox("Are you sure you want to change the Date of Accident?");
frmCB.ShowDialog();
if (frmCB.intButton == 0)
{
return;
}
datDOA.Format = DateTimePickerFormat.Long;
//...Connect to Database...//
string strCaseNo = txtCaseNo.Text;
string strConnect = BuildConnectionString();
SqlConnection linkToDB = new SqlConnection(strConnect);
linkToDB.Open();
//...Send User Input to Database...//
DateTime dateNewDate = datDOA.Value;
string commandText = "UPDATE tblCases SET DOA = @DOAVal WHERE CaseNo = @CaseNoVal;";
SqlCommand sqlCom = new SqlCommand(commandText, linkToDB);
sqlCom.Parameters.Add("@DOAVal", SqlDbType.DateTime);
sqlCom.Parameters.Add("@CaseNoVal", SqlDbType.VarChar);
sqlCom.Parameters["@DOAVal"].Value = dateNewDate;
sqlCom.Parameters["@CaseNoVal"].Value = strCaseNo;
sqlCom.ExecuteNonQuery();
linkToDB.Close();
}
您需要保留DateTimePicker控件的旧值才能将其切换回。 另外,您的对话框表单会干扰下拉菜单的关闭,因此您必须给它一个关闭的机会。
像这样:
public partial class Form1 : Form {
private DateTime _OldValue;
public Form1() {
InitializeComponent();
_OldValue = dateTimePicker1.Value;
dateTimePicker1.ValueChanged += new EventHandler(dateTimePicker1_ValueChanged);
}
void dateTimePicker1_ValueChanged(object sender, EventArgs e) {
this.BeginInvoke(new MethodInvoker(delegate { ConfirmDateChange(); }));
}
private void ConfirmDateChange() {
frmConfirmBox frmCB = new frmConfirmBox();
if (frmCB.ShowDialog() == DialogResult.OK) {
_OldValue = dateTimePicker1.Value;
// do your database update here
} else {
// temporarily stop firing ValueChanged event while we switch it back:
dateTimePicker1.ValueChanged -= dateTimePicker1_ValueChanged;
dateTimePicker1.Value = _OldValue;
dateTimePicker1.ValueChanged += dateTimePicker1_ValueChanged;
}
}
}
我不确定您的要求是什么,但是也许您可以订阅DateTimePicker ValueChanged事件,并且在他们更改所选日期之后,您可以询问他们是否确定要将日期从X更改为Y。如果他们选择“取消”,则可以随时回滚到上一个选定的日期。
编辑:假设您的DateTimePicker的名称是dateTimePicker1:
这是一个名为DTP的示例类,它将完成此操作
public partial class DTP : Form
{
DateTime lastSelectedValue;
public DTP()
{
InitializeComponent();
lastSelectedValue = dateTimePicker1.Value;
dateTimePicker1.ValueChanged += new EventHandler(dateTimePicker1_ValueChanged);
}
void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
DialogResult di = MessageBox.Show("Change " + lastSelectedValue.ToString() + " to " + dateTimePicker1.Value.ToString(), "?", MessageBoxButtons.OKCancel, MessageBoxIcon.Question)
if(di== System.Windows.Forms.DialogResult.OK)
{
SetSqlDateTimeValue( dateTimePicker1.Value );
lastSelectedValue = dateTimePicker1.Value;
}
else
{
dateTimePicker1.ValueChanged -= dateTimePicker1_ValueChanged;
//Setting back the dtp to the old value
dateTimePicker1.Value = lastSelectedValue;
dateTimePicker1.ValueChanged += dateTimePicker1_ValueChanged;
}
}
private void SetSqlDateTimeValue(DateTime dateTime)
{
throw new NotImplementedException();
}
}
注意,我已经在顶部声明了一个名为lastSelectedValue的DateTime变量。 然后在更改值之后,我将询问用户是否希望继续执行操作,是否执行SQL任务,是否不执行SQL操作,是否将dateTimePicker1的Value属性设置为lastSelectedValue。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.