Click here to Skip to main content
15,890,186 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hello,

I do not know and I try to sort datagridview. I want to sort by "Time".
I have 4 columns with 3 columns in string and and 1 in DataTime.
I want to sort column Date
Below my code.
C#
 <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);
				}
			
			}


What I have tried:

I try use this:
C#
dataGridView1.Sort(dataGridView1.Columns["Date"], ListSortDirection.Ascending);

But recieved error.
I do not have any idea how can I sort.
Posted
Updated 20-Apr-19 23:37pm
Comments
[no name] 20-Apr-19 17:11pm    
And what was the "error"? ... which may have nothing to do with "sorting".
5TY 21-Apr-19 12:43pm    
This data is not connected with tbinding list.

1 solution

Without knowing the exact error you get, we have to guess - but the most likely is
DataGridView control must be bound to an IBindingList object to be sorted.
Which mans that you have used the list directly as the DataSource for the DGV.
The easiest solution is to convert the List to a DataTable, and use that as the source.
That's a pain, so I wrote this: Converting a List to a DataTable[^] to do just that...
Then it's trivial:
            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; }
        }
 
Share this answer
 
Comments
5TY 21-Apr-19 14:30pm    
Hi,
Thank you for answer. But right now I have a error below, releted with DataTable dt = list.ToDataTable();

Severity Code Description Project File Line Suppression State
Error CS1061 'List<form1.myclass>' does not contain a definition for 'ToDataTable' and no extension method 'ToDataTable' accepting a first argument of type 'List<form1.myclass>' could be found (are you missing a using directive or an assembly reference?)
OriginalGriff 22-Apr-19 3:57am    
That's because it's an extension method and you haven't put it where it can be used...
5TY 22-Apr-19 9:12am    
<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;


This is my code. I first time try to sort so this is difficult for me how to use this method..
OriginalGriff 22-Apr-19 9:59am    
And? What happens?
5TY 21-Apr-19 14:40pm    
I forgote add 3 last line with my code.


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

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900