我需要在一个单元格中创建一个格式/掩码,以防止用户输入不相关的数据。
列单元格包含日期值,例如"MM/YYYY"
没有日期值。
我尝试了以下方法来做出这个定义,但没有成功:
dataGridView1.Columns[0].DefaultCellStyle.Format = "##/####" // || dd/yyyy
另外,我尝试从那里转到属性DataGridView
并进行定义Format
。
我需要在一个单元格中创建一个格式/掩码,以防止用户输入不相关的数据。
列单元格包含日期值,例如"MM/YYYY"
没有日期值。
我尝试了以下方法来做出这个定义,但没有成功:
dataGridView1.Columns[0].DefaultCellStyle.Format = "##/####" // || dd/yyyy
另外,我尝试从那里转到属性DataGridView
并进行定义Format
。
您用于格式化的方法是有效的方法。这里可能会发生一些问题。请确保:
DateTime
而不是type string
。类型string
将不会按预期应用格式。(参见下面示例中的第 1 列和第 2 列。)DataGridViewTextBoxCell.Style.Format
没有被设置为与您想要的格式不同的东西。这将覆盖列格式。(参见下面示例中的第 3 列。)例子
this.dataGridView1.ColumnCount = 4;
this.dataGridView1.RowCount = 1;
this.dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
DateTime date = DateTime.Now;
this.dataGridView1[0, 0].Value = date;
this.dataGridView1[1, 0].Value = date.ToString();
this.dataGridView1[2, 0].Value = date.ToString("MM/yyyy");
this.dataGridView1[3, 0].Value = date;
this.dataGridView1[3, 0].Style.Format = "MM/yyyy";
this.dataGridView1.Columns[0].DefaultCellStyle.Format = "dd/yyyy";
this.dataGridView1.Columns[1].DefaultCellStyle.Format = "dd/yyyy";
this.dataGridView1.Columns[2].DefaultCellStyle.Format = "dd/yyyy";
this.dataGridView1.Columns[3].DefaultCellStyle.Format = "dd/yyyy";
从输出中可以看出:
Columns[0]
包含 aDateTime
并正确格式化为"dd/yyyy"
.Columns[1]
包含 astring
并且不能重新格式化为"dd/yyyy"
.Columns[2]
包含已格式化string
且无法重新格式化为"dd/yyyy"
.Columns[3]
包含 aDateTime
并且格式被单元格格式覆盖"MM/yyyy"
。要纠正这些问题,只需使用DateTime
对象而不是任何string
表示来设置单元格值。
如果您从某个外部来源获取此数据并且它已经是 type string
,您可以Parse
这样做,但请注意,对象的缺失部分DateTime
将被默认设置,如果没有原始完整数据,您实际上无能为力:
DateTime date = DateTime.Parse("10/2016");
Console.WriteLine("Output: {0}", date.ToString());
// Output: 10/1/2016 12:00:00 AM
验证
如果验证用户输入(并丢失编辑格式)是您主要关心的问题,请考虑使用以下验证方法来取消无效编辑:
private void DataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
DateTime parsed;
if (!DateTime.TryParse(e.FormattedValue.ToString(), out parsed))
{
this.dataGridView1.CancelEdit();
}
}
再加上这个使用事件处理程序重新应用格式的答案。DataGridView.CellFormatting
(请注意,这也不需要确保您的数据类型不是string
,但由于事件经常触发,成本更高。)