如何在DataGridView单元格中制作格式掩码?

时间:2016-12-16 12:51:59

标签: c# datagridview datagridcell

我需要在单元格中制作格式/掩码,以防止用户输入不相关的数据。

列单元格包含日期值,例如"MM/YYYY",没有日期值。

我尝试了以下内容来制定此定义,但没有成功:

dataGridView1.Columns[0].DefaultCellStyle.Format = "##/####" // || dd/yyyy

此外,我尝试转到DataGridView的属性并从那里定义Format

1 个答案:

答案 0 :(得分:1)

您用于格式化is a valid approach的方法。这里可能会发生一些问题。请确保:

  1. 基础数据类型为DateTime类型为string。类型string将不会按预期应用格式。 (参见下面示例中的第1列和第2列。
  2. 个人DataGridViewTextBoxCell.Style.Format未设置为与所需格式不同的内容。这将覆盖列格式。 (参见下面示例中的第3列。
  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";
    

    Cols output: 16/2016, 12/16/2016 8:52:17 AM, 12/2016, 12/2016

    从输出中可以看出:

    1. Columns[0]包含DateTime,格式正确为"dd/yyyy"
    2. Columns[1]包含string,无法重新格式化为"dd/yyyy"
    3. Columns[2]包含格式化的string,无法重新格式化为"dd/yyyy"
    4. Columns[3]包含DateTime,格式被单元格格式"MM/yyyy"覆盖。
    5. 要解决这些问题,只需使用DateTime对象设置您的单元格值,而不是使用任何string表示。

      如果您从某些外部来源获取此数据并且已经类型为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();
          }
      }
      

      this answer结合使用DataGridView.CellFormatting事件处理程序重新应用您的格式。 (请注意,这也无需确保您的数据类型不是string,但由于事件经常被触发,因此成本更高。)