You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DataSet字符串转Int后仍无法解决DataGridView排序异常问题

问题原因

你遍历行转换单元格数据类型的操作无效,核心原因是DataColumn的DataType仍为String类型——DataGridView排序时依据的是列的DataType规则,而非单个单元格的值类型,所以依然会按字符串排序逻辑处理(字符串比较是逐字符对比,"2"会排在"4"前面)。

解决方案

以下是三种可行的修复方式:

方式1:创建新表并指定列类型(最稳妥)

复制原表结构,修改目标列的DataType后重新填充转换后的数据:

DataXML = new DataSet();
FileStream fs = new FileStream(file_name, FileMode.Open);
xml_read = new XmlTextReader(fs);
DataXML.ReadXml(xml_read, XmlReadMode.Auto);
DataTable originalTable = DataXML.Tables[0];

// 克隆原表结构,修改第三列类型为Int16
DataTable newTable = originalTable.Clone();
newTable.Columns[3].DataType = typeof(Int16);

// 转换数据并导入新表
foreach(DataRow row in originalTable.Rows)
{
    DataRow newRow = newTable.NewRow();
    for(int i = 0; i < originalTable.Columns.Count; i++)
    {
        newRow[i] = i == 3 ? Convert.ToInt16(row[i]) : row[i];
    }
    newTable.Rows.Add(newRow);
}

// 绑定新表到控件
bindingSource1.DataSource = newTable;
dataGridView1.DataSource = bindingSource1;
dataGridView1.EditMode = DataGridViewEditMode.EditOnEnter;

方式2:通过XSD架构定义列类型(适合可提前定义XML结构的场景)

如果能提前编写XML Schema(XSD)文件,指定目标列的类型为xs:short(对应C#的Int16),读取XML时先加载架构,DataSet会自动识别列类型:

DataSet dataXML = new DataSet();
// 先加载XSD架构文件
dataXML.ReadXmlSchema("your_schema_file.xsd");
// 再加载XML数据
dataXML.ReadXml(file_name);

// 直接绑定即可
bindingSource1.DataSource = dataXML.Tables[0];
dataGridView1.DataSource = bindingSource1;

XSD中目标列的示例定义:

<xs:element name="YourColumn" type="xs:short" />

方式3:修改原表列类型(需先清空数据)

若要直接修改原表的列类型,必须先清空所有行数据,否则会因数据类型不兼容报错:

DataXML = new DataSet();
FileStream fs = new FileStream(file_name, FileMode.Open);
xml_read = new XmlTextReader(fs);
DataXML.ReadXml(xml_read, XmlReadMode.Auto);
DataTable myTable = DataXML.Tables[0];

// 先保存所有行数据
List<object[]> rowValues = new List<object[]>();
foreach(DataRow row in myTable.Rows)
{
    rowValues.Add(row.ItemArray.Clone() as object[]);
}

// 清空数据并修改列类型
myTable.Rows.Clear();
myTable.Columns[3].DataType = typeof(Int16);

// 重新填充转换后的数据
foreach(object[] values in rowValues)
{
    values[3] = Convert.ToInt16(values[3]);
    myTable.Rows.Add(values);
}

// 绑定控件
bindingSource1.DataSource = myTable;
dataGridView1.DataSource = bindingSource1;
dataGridView1.EditMode = DataGridViewEditMode.EditOnEnter;

内容的提问来源于stack exchange,提问作者speedevil123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 20:12:39