tijd soorteren listview

Status
Niet open voor verdere reacties.

Jan123451

Gebruiker
Lid geworden
21 apr 2012
Berichten
21
Hey,

Ik ben bezig om een overzicht te maken voor iets, maar ik heb een probleem. Ik heb een kolom met tijden erin. Er zitten ook een paar tijden bij die meer dan 100 uur zijn. Maar het programma ziet 113 uur als 11,3 uur. Hoe kan ik dat oplossen?

capture1zd.png
 
Je kunt bv timespan gebruiken hier

110uur / 20min in dit voorbeeld
Code:
TimeSpan time = new TimeSpan(110, 20, 0);
string myTimeStamp = time.TotalHours.ToString();

Hier zul je 110,33 uur krijgen

Om te sorteren zou je eens kunnen kijken naar de IComparable interface.
 
Hier heb ik de source van de ItemComparer vandaan:
http://www.c-sharpcorner.com/uploadfile/nipuntomar/sort-a-multicolumn-listview-in-C-Sharp/

En dit heb ik gebruikt in Form1:
[js] {
ItemComparer sorter = listView1.ListViewItemSorter as ItemComparer;
if (sorter == null)
{
sorter = new ItemComparer(e.Column);
sorter.Order = SortOrder.Ascending;
listView1.ListViewItemSorter = sorter;
}
// if clicked column is already the column that is being sorted
if (e.Column == sorter.Column)
{
// Reverse the current sort direction
if (sorter.Order == SortOrder.Ascending)
sorter.Order = SortOrder.Descending;
else
sorter.Order = SortOrder.Ascending;
}
else
{
// Set the column number that is to be sorted; default to ascending.
sorter.Column = e.Column;
sorter.Order = SortOrder.Ascending;
}
listView1.Sort();
}

private void FillItems()
{

addItems(new string[] { "Aalbessen", "13:20:00", "4", "27" });
addItems(new string[] { "Aardappels", "13:00:00", "4", "17" });
addItems(new string[] { "Basilicum", "09:00:00", "3", "38", });
addItems(new string[] { "Bloemkolen", "12:00:00", "4", "13", });
addItems(new string[] { "Bosbessen", "12:00:00", "4", "25", });
addItems(new string[] { "Mirabellen", "14:40:00", "6", "29", });
addItems(new string[] { "Noten", "103:20:00", "13", "35", });
addItems(new string[] { "Olijven", "113:20:00", "13", "36", });
addItems(new string[] { "Rode Kolen", "120:00:00", "13", "37", });
addItems(new string[] { "Spinazie", "13:20:00", "4", "10", });
addItems(new string[] { "Tomaten", "09:50:00", "5", "8", });
addItems(new string[] { "Uien", "08:20:00", "4", "9", });

}

private void addItems(string[] items)
{
if (listView1.Columns.Count == items.Length)
{
ListViewItem item = new ListViewItem(items[0]);
for (int i = 1; i < items.Length; i++)
{
item.SubItems.Add(items);
}
listView1.Items.Add(item);
}
}[/js]
In het plaatje in mijn eerste post was de tijd in hh:mm, ik heb het aangepast en veranderd in hh:mm:ss ;)

En dan werkt het sorteren, maar hoe moet ik timespan dan gebruiken?
 
Nou, je kan de inhoud van je ListView splitten (op ':'). En dan de code van Bloodshed gebruiken.
 
ipv "103:20:00" zou je een method kunnen gebruiken om het aantal uren weer te geven.

Code:
private string GetTimeStamp(int hours, int minutes, int seconds)
        {
            var span = new TimeSpan(hours, minutes, seconds);
            return span.TotalHours.ToString("0.00");
        }


Edit: zo dus

Code:
addItems(new string[] { "Noten", "103:20:00", "13", "35", });
>>>
addItems(new string[] { "Noten", GetTimeStamp(103,20,0), "13", "35", });
 
Laatst bewerkt:
Waar moet ik die source dan neerzetten zodat het toch nog gesorteerd kan worden?
 
Het idee is dat je een class maakt voor je producten en dan de IComparable interface implementeert op deze class.
Je kunt dan een lijst maken met producten maken en deze sorteren aan de hand van jou implementatie van IComparable en de listview dan vullen met de sorted data.

bv: als de tijd waarden gelijk zijn sorteer je op de naam van het product en anders op de tijd.

http://msdn.microsoft.com/en-us/library/system.icomparable(v=vs.90).aspx


Edit: Voorbeeldje http://dl.dropbox.com/u/63676419/ProductExample.zip
 
Laatst bewerkt:
De bedoeling is dat je ook kan sorteren op product, level of oogst.

Ik zie net dat ik in de topic titel sorteren verkeerd heb geschreven xD
 
Dat kun je nog aanpassen: Klik op Bericht aanpassen in je eerste post en pas daar de titel aan ;)
 
Als ik die datums verander door tijden werkt het niet meer.
Ik ben geen expert met C#, dus wat bedoel je met "voeg zelf ASC/DESC toe"? :p
 
Als ik een 3e of 4e kolom toevoeg krijg ik een error: 'ProductExample.Product' does not contain a constructor that takes 3 arguments
hoe moet ik dat oplossen?
 
In het voorbeeld?

De product class in het voorbeeld heeft in de constructor

Code:
public Product(string name, TimeSpan time)

Volgens de error geef je 3 waardes als je een product maakt. Pas de class en/of constructor aan zoals je het wil gebruiken.

bv:
Code:
public Product(string name, TimeSpan time, string description)

(deze error komt niet van het toevoegen van een kolom ergens)
 
The type or namespace name 'description' could not be found (are you missing a using directive or an assembly reference?)
Ik moet nog ergens iets aanpassen :/
 
[JS] private List<Product> _products;

private void FillProducts()
{
_products = new List<Product>
{
new Product("Bessen", new TimeSpan(102,20,0), new description(55)),
new Product("Noten", new TimeSpan(11,59,0), new description(48)),
new Product("Koala's", new TimeSpan(101,40,0), new description(7)),
new Product("Geiten", new TimeSpan(5,17,0), new description (98)),
new Product("Brood", new TimeSpan(91,20,0), new description (846)),
new Product("Apen", new TimeSpan(51,6,0), new description (446))
};
}[/JS]
 
Als je description een string is moet je hier ipv new description(55) gewoon "55" invoeren. Het keyword new gebruik je als je bv een nieuwe class maakt bij een string is dit mogelijk maar niet gebruikelijk.
 
Nu heb ik weer een ander probleem:

[JS] return lvi1.SubItems[ColumnIndex].Text.CompareTo(lvi2.SubItems[ColumnIndex].Text);[/JS]

ArgumentOutOfRangeException was unhandled
InvalidArgument=Value of '2' is not valid for 'index'.
Parameter name: index
 
Dan bestaat de index 2 niet. Als je 3 kolommen hebt heb je 2 sub items met index 0 en 1.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan