如何检查数据网格视图输入类型是否与 C# 中的基础数据类型匹配

本文关键字:是否 数据类型 类型 输入 检查 何检查 数据 视图 网格 数据网 | 更新日期: 2023-09-27 18:31:47

我想检查数据网格视图输入值类型是否与相应的单元格数据类型匹配。例如,如果我给出数字输入,它将检查相应的数据绑定数据网格视图列的数据类型是否为数字。如果字符串作为输入给出,那么它将显示错误消息,反之亦然。我试过这样:

private void dgvLoadTable_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
     if(e.FormattedValue.GetType() != dgvLoadTable.CurrentCell.ValueType.UnderlyingSystemType)
     MessageBox.Show("Input type is wrong"); }
}

但即使输入正确,这也会显示错误消息。谁能告诉我如何正确做到这一点,请?

如何检查数据网格视图输入类型是否与 C# 中的基础数据类型匹配

我已经分析了你的源代码。对我来说一切都很好。也许您的数据源中存在错误?

public partial class Form1 : Form
{
    private BindingList<Class> DataSource = new BindingList<Class>();
    public Form1()
    {
        InitializeComponent();            
        dgvLoadTable.DataSource = DataSource;            
    }
    private void dgvLoadTable_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
    {
        if (e.FormattedValue.GetType() != dgvLoadTable.CurrentCell.ValueType.UnderlyingSystemType)
            MessageBox.Show("Input type is wrong");
    }
}
public class Class
{
    public string StringData { get; set; }
    public int IntData { get; set; }
}

问题是 Value 和 FormattedValue 或 ValueType 和 FormattedValueType 之间的差异。值类型是列的实际类型。FormattedValueType 是网格用来显示用户输入的值或类型的类型。如果您有整数行,则该值的格式为字符串。相同:如果你输入一个整数,你只需要输入一个字符串,该字符串被网格解析为整数。因此,很难以这种方式执行所需的检查,因为所有输入都是字符串,很难确定您的意思是 1 还是"1"。

使用 DataGrid 的 DataError 事件对错误的输入做出反应。(例如,整数列中的字母)

e.FormattedValue.GetType()将返回DataGridViewTextBoxColumn的字符串(例如对于DataGridViewImageColumn,它将返回System.Drawing.Bitmap),与dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].FormattedValueType相同,这是只读的。要设置列的类型,您可以执行以下操作:

myColumn.ValueType = typeof(int);

然后,您可以订阅DataError事件而不是CellValidating事件(每当用户输入到单元格中的数据或应用程序错误时,都会引发该事件)。(当列中的数据绑定到数据源时,默认ValueType分配给绑定数据的类型)

 void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            // process your data error here
            Console.WriteLine(dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].ValueType + "'n" + e.Exception); 
        }