Xml dataGridView排序问题

时间:2011-05-19 14:14:53

标签: c# xml datagridview

我正在读取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

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);
            }
        }
    }
}