我有一个链接到 MySQL 数据库的表单。 我希望表单上有 3 个 dateTimePicker 以允许三个日期,但是,如果未选择一个,我希望该选取器显示为空白,而不是当前日期。
我正在使用以下代码,当我更改日期时,出现错误“System.Windows.Forms.dll 中发生了类型为‘System.StackOverflowException’的未处理异常”选择器。
private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
if (txtdateTimePicker1.Text != "1/1/2000 12:00:00 AM")
{
dateTimePicker1.Format = DateTimePickerFormat.Short;
dateTimePicker1.Text = txtdateTimePicker1.Text;
}
else
{
dateTimePicker1.Format = DateTimePickerFormat.Custom;
dateTimePicker1.CustomFormat = " ";
dateTimePicker1.Text = "";
}
}
故障排除提示告诉我:确保没有无限循环或无限递归。
基本上,文本框“txtdateTimePicker1”填充表单加载时的日期值,如果读取特定日期,“dateTimePicker1” " 显示空值。
我认为循环发生是因为它查看txtdateTimePicker1的值,然后更改dateTimePicker1的值,从而导致它再次触发ValueChanged事件,但是我现在知道还有其他方法可以正确触发该事件。有没有办法使用 While 循环来代替?有句话说:
While (txtdateTimePicker1.Text == "1/1/2000 12:00:00 AM")
{
dateTimePicker1.Format = DateTimePickerFormat.Custom;
dateTimePicker1.CustomFormat = " ";
dateTimePicker1.Text = "";
}
但是
if (txtdateTimePicker1.Text != "1/1/2000 12:00:00 AM")
{
dateTimePicker1.Format = DateTimePickerFormat.Short;
dateTimePicker1.Text = txtdateTimePicker1.Text;
}
我对 While 循环真的很陌生,我确实研究了它们一些,并且我了解它们是如何工作的,但我真的不知道语法。
或者...由于在初始化表单时填充了文本框,有没有办法可以以不同的方式触发我需要的代码?
此外,我知道我可能不会在这里使用最佳实践方法,稍后会介绍。我需要尝试使其正常工作,并且除了这一个事件之外,我的表单的其余部分都可以正常工作。请不要因为我没有使用正确的方法而责备我,相反,请帮助我解决手头的问题。
系统信息:
- Windows 8.1
- .NET Framework 4.5
- Visual Studio 2013 旗舰版
- 适用于 Visual Studio 的 MySQL 5.6
完整表单代码(减去 MySQL 连接字符串:)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using MySql.Data.MySqlClient;
namespace _2014BillOfMaterials
{
public partial class BillofMaterialsRevisions : Form
{
public BillofMaterialsRevisions(string s)
{
if (s != "- Select a Job -")
{
string server = "192.168.1.149";
string database = "####";
string userid = "iuapp";
string password = "iuapp";
string str;
str = "SERVER=" + server + ";" + "DATABASE=" + database + ";" + "UID=" + userid + ";" + "PASSWORD=" + password + ";";
MySqlConnection con = null;
con = new MySqlConnection(str);
MySqlConnection myconn = new MySqlConnection(str);
MySqlDataAdapter jobNumber = new MySqlDataAdapter("SELECT * FROM jobnumbers where jobNumber = '" + s + "'", myconn);
DataTable dtJobNumber = new DataTable("jobnumbers");
DataSet dtJobNumber2 = new DataSet();
jobNumber.Fill(dtJobNumber);
InitializeComponent();
this.WindowState = FormWindowState.Maximized;
MySqlDataAdapter adapter = new MySqlDataAdapter("SELECT * FROM jobnumbers where jobNumber = '" + s + "'", myconn);
adapter.Fill(dtJobNumber2);
textBox2.Text = dtJobNumber2.Tables[0].Rows[0][6].ToString();
textBox1.Text = dtJobNumber2.Tables[0].Rows[0][8].ToString();
textBox3.Text = dtJobNumber2.Tables[0].Rows[0][10].ToString();
textBox4.Text = dtJobNumber2.Tables[0].Rows[0][0].ToString();
txtdateTimePicker1.Text = dtJobNumber2.Tables[0].Rows[0][5].ToString();
txtdateTimePicker2.Text = dtJobNumber2.Tables[0].Rows[0][7].ToString();
txtdateTimePicker3.Text = dtJobNumber2.Tables[0].Rows[0][9].ToString();
lblJobNumber.Text = s + " Revisions";
label10.Text = s;
}
else
{
//Show Error MessageBox
MessageBox.Show("Please Select a Job.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
}
private void BillofMaterialsRevisions_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
string server = "192.168.1.149";
string database = "####";
string userid = "iuapp";
string password = "iuapp";
string str;
str = "SERVER=" + server + ";" + "DATABASE=" + database + ";" + "UID=" + userid + ";" + "PASSWORD=" + password + ";";
MySqlConnection myconn2 = new MySqlConnection(str);
MySqlConnection con = null;
con = new MySqlConnection(str);
con.Open();
string date1 = dateTimePicker1.Value.ToString("yyyy-MM-dd");
string date2 = dateTimePicker2.Value.ToString("yyyy-MM-dd");
string date3 = dateTimePicker3.Value.ToString("yyyy-MM-dd");
var cmd = new MySqlCommand("Insert into jobnumbers(id, jobNumber, IssuedDate, IssuedInitials, RevADate, RevAInitials, RevBDate, RevBInitials) SELECT DISTINCT '" +
textBox4.Text + "', '" +
label10.Text + "', '" +
date1 + "', '" +
textBox2.Text + "', '" +
date2 + "', '" +
textBox1.Text + "', '" +
date3 + "', '" +
textBox3.Text +
"' " +
"ON DUPLICATE KEY UPDATE id = '" + textBox4.Text + "' " +
", jobNumber = '" + label10.Text + "' " +
", IssuedDate = '" + date1 + "' " +
", IssuedInitials = '" + textBox2.Text + "' " +
", RevADate = '" + date2 + "' " +
", RevAInitials = '" + textBox1.Text + "' " +
", RevBDate = '" + date3 + "' " +
", RevBInitials = '" + textBox3.Text + "'", con);
cmd.ExecuteNonQuery();
}
private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
if (txtdateTimePicker1.Text == "1/1/2000 12:00:00 AM")
{
dateTimePicker1.Format = DateTimePickerFormat.Short;
dateTimePicker1.Text = txtdateTimePicker1.Text;
}
else
{
dateTimePicker1.Format = DateTimePickerFormat.Custom;
dateTimePicker1.CustomFormat = " ";
dateTimePicker1.Text = "";
}
}
private void dateTimePicker2_ValueChanged(object sender, EventArgs e)
{
if (txtdateTimePicker2.Text != "" || txtdateTimePicker2.Text != "1/1/2000 12:00:00 AM")
{
dateTimePicker2.Format = DateTimePickerFormat.Short;
dateTimePicker2.Text = txtdateTimePicker2.Text;
}
else
{
dateTimePicker2.Format = DateTimePickerFormat.Custom;
dateTimePicker2.CustomFormat = " ";
dateTimePicker2.Text = "";
}
}
private void dateTimePicker3_ValueChanged(object sender, EventArgs e)
{
if (txtdateTimePicker3.Text != "" || txtdateTimePicker3.Text != "1/1/2000 12:00:00 AM")
{
dateTimePicker3.Format = DateTimePickerFormat.Short;
dateTimePicker3.Text = txtdateTimePicker3.Text;
}
else
{
dateTimePicker3.Format = DateTimePickerFormat.Custom;
dateTimePicker3.CustomFormat = " ";
dateTimePicker3.Text = "";
}
}
}
}
最佳答案
不允许将 ""(空)
设置为 Text
属性,因为 Text
属性应该是有效日期时间对象。看看它的documentation .
解决此问题的一种方法是禁用 DateTimePicker
控件并在需要时重新启用它。
用途:
dateTimePicker1.Enabled = True; // enables it
dateTimePicker1.Enabled = False; // disable it
希望对你有帮助!
关于c# - 如果 TextBox 为特定值,则将 dateTimePicker 设置为 Null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22482162/