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
相关产品推荐
相关产品推荐

