Xml dataGridView Проблема заказа - PullRequest
0 голосов
/ 19 мая 2011

Я читаю в XML-файле набор данных, затем отображается в dataGridView в VS.Будет сгенерирован 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 голосов
/ 19 мая 2011

Требуется реализация Порядка естественной сортировки для столбца в DataTable в вашем наборе данных.

Как вы уже заметили, собственные параметры сортировки, доступные для DataSets /DataTables довольно ограничены.Однако вы можете использовать метод AsEnumerable().OrderBy, чтобы указать столбец в DataTable для сортировки, и вы можете передать IComparer, который реализует естественный порядок сортировки для данных в этом столбце.Я включил код ниже, который демонстрирует;добавьте кнопку и 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.
        //   /220358/estestvennyi-poryadok-sortirovki-v-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);
            }
        }
    }
}
0 голосов
/ 19 мая 2011

Вы хотите установить ValueType DataGridViewColumn в числовой тип данных - в настоящее время он сортируется в виде строки ..

Редактировать: если вы назначаете набор данных как источник данных, вы не можете изменить тип значения столбца. Хотя вы не можете контролировать XML, возможно, вы можете изменить тип столбца в наборе данных?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...