[ zenmorke @ 22.07.2010. 19:00 ] @
Naime, upitom vracam podatke kojima treba da popunim listbox, u pitanju su kucni brojevi koji mogu imati i slovnu oznaku uz broj i ID reda pod kojim je taj broj.

upit ide ovako

"SELECT ID, Broj FROM table WHERE aa= '" + aa + "' AND bb= '" + bb+ "' ORDER BY Broj"

U pitanju su stringovi,vracene podatke skladistim u tabelu DataTable p iscitivam svaki red i ubacujem u ListItem da bi popunio ListBox,ovako nesto :

Code:

public void VratBrojeve(string Upit, ListBox LSB)
        {
            DataTable dt = null;
            try
            {
                if (!String.IsNullOrEmpty(Upit))
                {
                    OleDbCommand command = new OleDbCommand(Upit, konekcija);
                    OleDbDataAdapter adapter = new OleDbDataAdapter(command);
                    dt = new DataTable();
                    adapter.Fill(dt);
                    foreach (DataRow row in dt.Rows)
                    {
                        
                        ListItem item = new ListItem(row["Broj"].ToString(), row["ID"].ToString());
                        LSB.Items.Add(item);
                    }
                }
            }
            catch
            {
                dt = null;
            }
        }


na kraju mi iscita u listboxu ovako,npr.

1
10
10a
19
2
20
24
25a
3

Hocu da mi lepo iscita

1
1a
2
3
4
5
....

Trazio sam neka resenja po netu ali sva rade isto i ne sortiraju lepo

Tnx in advance,
Marko.
[ Dejan Carić @ 22.07.2010. 19:38 ] @
Code:
[SuppressUnmanagedCodeSecurity]
internal static class SafeNativeMethods
{
    [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
    public static extern int StrCmpLogicalW(string psz1, string psz2);
}

public class NaturalStringComparer : IComparer<string>
{
    public int Compare(string a, string b)
    {
        return SafeNativeMethods.StrCmpLogicalW(a, b);
    }
}


I onda negde u kodu pozoveš:

Code:
List<string> list = new List<string>();
list.Add("1");
list.Add("10");
list.Add("10a");
list.Add("19");
list.Add("2");
list.Add("20");
list.Add("24");

list.Sort(new NaturalStringComparer());
StringBuilder sb = new StringBuilder();

foreach (var item in list)
{
    sb.AppendLine(item);
}

MessageBox.Show(sb.ToString());
[ zenmorke @ 23.07.2010. 16:26 ] @
Pokusavam vec satima da iskoristim ovaj kod, ali sve sto sam uspeo je da mi sortira samo brojeve i to je uradio dobro ali su poredjani
horizontalno u listboxu!

1 2 3 7 9 10 10a .....

a treba da idu vertikalno, i drugo, ne znam kako da iskoristim ovaj kod da mogu da prebacim obe vrednosti u ListBox(ID i Broj) a da bude sortirano po brojevima!

[ zenmorke @ 23.07.2010. 17:08 ] @
E izvinjavam se, uspeo sam, dosao sam do elegantnog resenja :)
Problem je bio sto sam usepo da izdvojim brojeve i da ih sortiram a nisam uspeo da ih ponovo spojim sa svojim ID-jevima dok se nisam sabrao sa mozgom :P

Znaci ti klasu za sortiranje sam prebacio iz treceg sloja u drugi sloj BLL i dodao jos neku funkcionalnost...

prvo dodati sledece biblioteke ako vec nisu dodate

Code:

using System.Collections;
using System.Text;
using System.Security;
using System.Runtime.InteropServices;
using System.Collections.Specialized;


pa onda sledece

Code:

[SuppressUnmanagedCodeSecurity]
        internal static class SafeNativeMethods
        {
            [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
            public static extern int StrCmpLogicalW(string psz1, string psz2);
        }

        public class NaturalStringComparer : IComparer<string>
        {
            public int Compare(string a, string b)
            {
                return SafeNativeMethods.StrCmpLogicalW(a, b);
            }
        }
public void NekaMetoda(par x,par y,par z, par c)
{
....

                    LSB.Items.Clear();
                    baza.VratBrojeve(upit, LSB); // ovde su vraceni podaci iz baze i popunjeni u ListBoxu
                    baza.AccessDekonekcija();

                    // napravio sam dve liste da bih izdvojio text i value vrednost vracene upitom
                   // i da bih sortirao po text vrednosti
                    List<string> textList = new List<string>();
                    List<string> valueList = new List<string>();

                    
                    foreach (ListItem item in LSB.Items)
                    {
                        textList.Add(item.Text);
                    }

                    textList.Sort(new NaturalStringComparer()); // ovde se sortiraju brojevi 

                    foreach (object item in textList)
                    {
                        string value = LSB.Items.FindByText(item.ToString()).Value;
                        valueList.Add(value);
                    }

                    LSB.Items.Clear(); // ocistimo ListBox od prethodnih ne sortiranih vrednosti

                    for (int i = 0; i < textList.Count; i++)
                    {
                        ListItem objItem = new ListItem(textList[i].ToString(), valueList[i].ToString());
                        LSB.Items.Add(objItem);
                    }
}


sljaka kao leptir :)

prilicno korisna stvar kad podaci ne mogu da se sortraju preko upita :)