5TY Ответов: 1

Как мне отсортировать datagridview


Привет,

Я не знаю и пытаюсь отсортировать datagridview. Я хочу отсортировать по "времени".
У меня есть 4 столбца с 3 столбцами в строке и 1 в DataTime.
Я хочу отсортировать дату столбца
Ниже моего кода.
 <pre>
var test = d.DocumentNode.SelectNodes("//td");
			string patt = "HOST\\=(.*)\\&\\;SERVICE\\=(.*)...IMG(.*)title\\=\"(.*):(.*):(.*)\"\\salt\\=\"(.*):(.*):(.*)\"\\ssrc(.*)border";
			Regex regex = new Regex(patt, RegexOptions.IgnoreCase);

			List<Powiadomienie> powiadomienia = new List<Powiadomienie>();
			foreach (var item in test) 
			{
				
					Match match = regex.Match(item.InnerHtml);


				if (match.Groups.Count > 1)

				{
					Powiadomienie powiadomienie = new Powiadomienie();

					
					powiadomienie.Host = match.Groups[1].Value;
					powiadomienie.Service = match.Groups[2].Value;
					powiadomienie.Time = match.Groups[6].Value;
					powiadomienie.Colour = match.Groups[8].Value;
					powiadomienie.AltValueTime = match.Groups[9].Value;

					if (!powiadomienie.AltValueTime.Contains('m'))
					{
						powiadomienie.AltValueTime = "0m" + powiadomienie.AltValueTime;
					}

					if (!powiadomienie.AltValueTime.Contains('h'))
					{
						powiadomienie.AltValueTime = "0h" + powiadomienie.AltValueTime;
					}

					if (!powiadomienie.AltValueTime.Contains('d'))
					{
						powiadomienie.AltValueTime = "0d" + powiadomienie.AltValueTime;
					}

					if (!powiadomienie.AltValueTime.Contains('s'))
					{
						powiadomienie.AltValueTime = powiadomienie.AltValueTime + "0s";
					}


					var temp = powiadomienie.AltValueTime.Replace('d', ':').Replace('h', ':').Replace('m', ':');
					var tempSplitted = temp.Split(':');
					powiadomienie.Date = DateTime.Now;
					powiadomienie.Date = powiadomienie.Date.AddDays(0 - Convert.ToInt32(tempSplitted[0]))
															.AddHours(0 - Convert.ToInt32(tempSplitted[1]))
															.AddMinutes(0 - Convert.ToInt32(tempSplitted[2]));


					powiadomienia.Add(powiadomienie);
				}
			
			}


Что я уже пробовал:

Я стараюсь использовать это:
dataGridView1.Sort(dataGridView1.Columns["Date"], ListSortDirection.Ascending);

Но получил ошибку.
Я понятия не имею, как я могу сортировать.

Gerry Schmitz

И в чем же заключалась эта "ошибка"? ... что, возможно, не имеет никакого отношения к "сортировке".

5TY

Эти данные не связаны со списком привязки tbinding.

1 Ответов

Рейтинг:
1

OriginalGriff

Не зная точной ошибки, которую вы получаете, мы должны угадать - но наиболее вероятным является

DataGridView control must be bound to an IBindingList object to be sorted.
Это означает, что вы использовали список непосредственно в качестве источника данных для DGV.
Самое простое решение-преобразовать список в DataTable и использовать его в качестве источника.
Это очень больно, поэтому я написал Вот это: Преобразование списка в таблицу данных[^] чтобы сделать именно это...
Тогда это тривиально:
            List<MyClass> list = new List<MyClass>();
            list.Add(new MyClass() { Name = "DDDD", Date = DateTime.Now });
            list.Add(new MyClass() { Name = "BBBB", Date = DateTime.Now.AddDays(-1) });
            list.Add(new MyClass() { Name = "CCCC", Date = DateTime.Now.AddDays(-2) });
            list.Add(new MyClass() { Name = "AAAA", Date = DateTime.Now.AddDays(-3) });
            DataTable dt = list.ToDataTable();
            dataGridView1.DataSource = dt;
            }
        private void SortByName_Click(object sender, EventArgs e)
            {
            dataGridView1.Sort(dataGridView1.Columns["Name"], ListSortDirection.Ascending);
            }

        private void SortByDate_Click(object sender, EventArgs e)
            {
            dataGridView1.Sort(dataGridView1.Columns["Date"], ListSortDirection.Ascending);
            }
        }
...
    public class MyClass
        {
        public string Name { get; set; }
        public DateTime Date { get; set; }
        }


5TY

Привет,
Спасибо за ответ. Но прямо сейчас у меня есть ошибка ниже, releted с DataTable dt = list.ToDataTable();

Описание Кода Серьезности Состояние Подавления Строки Файла Проекта
Список CS1061 ошибка в '<форму form1.класса MyClass&ГТ;' не содержит определение для 'ToDataTable', а не метод расширения 'ToDataTable', принимающий первый аргумент типа 'список<форму form1.класса MyClass&ГТ;' может быть найден (пропущена директива using или ссылка на сборку?)

OriginalGriff

Это потому, что это метод расширения, и вы не поместили его туда, где он может быть использован...

5TY

<pre>
var test = d.DocumentNode.SelectNodes("//td");
			string patt = "HOST\\=(.*)\\&\\;SERVICE\\=(.*)...IMG(.*)title\\=\"(.*):(.*):(.*)\"\\salt\\=\"(.*):(.*):(.*)\"\\ssrc(.*)border";
			Regex regex = new Regex(patt, RegexOptions.IgnoreCase);

			List<Powiadomienie> powiadomienia = new List<Powiadomienie>();
			foreach (var item in test) 
			{
				
					Match match = regex.Match(item.InnerHtml);


				if (match.Groups.Count > 1)

				{
					Powiadomienie powiadomienie = new Powiadomienie();

					
					powiadomienie.Host = match.Groups[1].Value;
					powiadomienie.Service = match.Groups[2].Value;
					powiadomienie.Time = match.Groups[6].Value;
					powiadomienie.Colour = match.Groups[8].Value;
					powiadomienie.AltValueTime = match.Groups[9].Value;

					if (!powiadomienie.AltValueTime.Contains('m'))
					{
						powiadomienie.AltValueTime = "0m" + powiadomienie.AltValueTime;
					}

					if (!powiadomienie.AltValueTime.Contains('h'))
					{
						powiadomienie.AltValueTime = "0h" + powiadomienie.AltValueTime;
					}

					if (!powiadomienie.AltValueTime.Contains('d'))
					{
						powiadomienie.AltValueTime = "0d" + powiadomienie.AltValueTime;
					}

					if (!powiadomienie.AltValueTime.Contains('s'))
					{
						powiadomienie.AltValueTime = powiadomienie.AltValueTime + "0s";
					}


					var temp = powiadomienie.AltValueTime.Replace('d', ':').Replace('h', ':').Replace('m', ':');
					var tempSplitted = temp.Split(':');
					powiadomienie.Date = DateTime.Now;
					powiadomienie.Date = powiadomienie.Date.AddDays(0 - Convert.ToInt32(tempSplitted[0]))
															.AddHours(0 - Convert.ToInt32(tempSplitted[1]))
															.AddMinutes(0 - Convert.ToInt32(tempSplitted[2]));


					powiadomienia.Add(powiadomienie);
				}
			
			}
List<Powiadomienie> powiadomieniaWybraneKolory = new List<Powiadomienie>();			powiadomieniaWybraneKolory = powiadomienia.Where(x => x.Colour == "yellow" || x.Colour == "red" || x.Colour == "purple").ToList<Powiadomienie>();					dataGridView1.DataSource = powiadomieniaWybraneKolory;

List<MyClass> list = new List<MyClass>();
			list.Add(new MyClass() { Name = "DDDD", Date = DateTime.Now });
			list.Add(new MyClass() { Name = "BBBB", Date = DateTime.Now.AddDays(-1) });
			list.Add(new MyClass() { Name = "CCCC", Date = DateTime.Now.AddDays(-2) });
			list.Add(new MyClass() { Name = "AAAA", Date = DateTime.Now.AddDays(-3) });
			DataTable dt = list.ToDataTable();
			dataGridView1.DataSource = dt;


Это мой код. Я первый раз пытаюсь разобраться, так что это трудно для меня, как использовать этот метод..

OriginalGriff

И что же? Что же происходит?

5TY

Я забыл добавить 3 последние строки с моим кодом.


List<Powiadomienie> powiadomieniaWybraneKolory = new List<Powiadomienie>();			powiadomieniaWybraneKolory = powiadomienia.Where(x => x.Colour == "yellow" || x.Colour == "red" || x.Colour == "purple").ToList<Powiadomienie>();					dataGridView1.DataSource = powiadomieniaWybraneKolory;