我正在读取XML文件中的数据集,然后显示在VS中的dataGridView上。将生成xml文件,并假设我无法更改它。当我显示并尝试按升序排序位置编号列时,它将无法正确排序,例如1,2,12,14将被安排1,12,14,2我假设如果我在结尾处卡住了0单个数字它会工作。但我希望有一个快速的工作或选择?
的dataGridView 位置 1 10 11 12 13 14 15 16 17 18 19 2
答案 0 :(得分:0)
您希望将ValueType of the DataGridViewColumn设置为数值数据类型 - 目前它正在按字符串排序..
编辑:如果您将数据集指定为DataSource,则无法更改列的valuetype。虽然您无法控制XML,但您可以更改数据集中的列类型吗?
答案 1 :(得分:0)
您正在寻找的是为DataSet中的DataTable中的列实现Natural Sort Order。
正如您已经注意到,DataSets / DataTables可用的本机排序选项非常有限。但是,您可以使用AsEnumerable().OrderBy
方法指定DataTable中的列进行排序,并且可以为此列中的数据传入IComparer that implements the natural sort order。我在下面列出了代码;将一个Button和一个DataGridView添加到表单中,您应该能够进行测试。
using System;
using System.Collections.Generic;
using System.Data;
using System.Runtime.InteropServices;
using System.Security;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1() {
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e) {
var dt = new DataTable();
dt.Columns.Add("Col1");
dt.Columns.Add("Col2");
dt.Rows.Add(new object[] { "row 1", "20" });
dt.Rows.Add(new object[] { "row 2", "2" });
dt.Rows.Add(new object[] { "row 3", "10" });
dt.Rows.Add(new object[] { "row 4", "1" });
var ds = new DataSet();
ds.Tables.Add(dt);
var query = ds.Tables[0].AsEnumerable().OrderBy(r => r.Field<string>("Col2"), new NaturalStringComparer());
dataGridView1.DataSource = query.AsDataView();
}
//
// Comparer for natural sort.
// https://stackoverflow.com/questions/248603/natural-sort-order-in-c
// ** see answers for warnings on this implementation **
//
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
private static extern int StrCmpLogicalW(string psz1, string psz2);
[SuppressUnmanagedCodeSecurity]
internal static class SafeNativeMethods
{
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
public static extern int StrCmpLogicalW(string psz1, string psz2);
}
public sealed class NaturalStringComparer : IComparer<string>
{
public int Compare(string a, string b) {
return SafeNativeMethods.StrCmpLogicalW(a, b);
}
}
}
}