Frage zu CString in ListBox ??????????


  • Administrator

    1. Nimm weniger Fragezeichen, dann ist man gewillter dir zu helfen.
    2. Eigentlich sollte da nichts verändert werden.
    3. Hast du auch das Sortieren in der ListBox abgeschaltet? Ist nämlich standardmässig an!
    4. Was steht denn wenn du im Debug-Modus das Programm laufen lässt in der Variabel 'nummer'?

    Grüssli



  • Hallo erstma und schonma Danke für die Mühe,

    also:

    1. nächstma weniger ??????? gut gut 😉
    2. Die Werte werden alle normal angezeigt in der ListBox
    3. ja, die Sortierung ist an bei mir
    4. im Debugmodus stehen eigentlich auch die richtigen Werte drin (dewegen versteh ich das auch nicht so ganz 😕 )



  • komischerweise kann ich die "nummer" zunächst in eine TextBox schreiben und sie dann wieder mittels GetDlgItem() auslesen und dann mit dem ausgelesen Wert in die Datenbank gehen. Das funktioniert. aber ich möchte nicht immer die Werte erst aus der ListBox in die TextBox dann da wieder raus und erst dann auf die DB loslassen. 😕



  • Formatier dir das mal mit CString::Format zusammen... also in etwa:

    CString strNumber = "0";
    // Wert in strNumber holen
    strNumber.Format(_T("SELECT * FROM \'%s\' WHERE Nr = \'%s\'"), DBTABELLE, strNumber);
    


  • und wie holst du denn die werte aus der ListBox?

    poste mal den code den du verwendest


  • Administrator

    Ehm und vielleicht noch eine Frage:
    Inwiefern geht es zum verrecken nicht? Was passiert denn eigentlich? Was für Fehler? (Eigentlich eine der wesentlichsten Fragen ^^)

    Und willst du wirklich, dass es in der ListBox sortiert? Denn dann verändern sich die Indices der eingegebenen Strings. Also könnte es sein, dass du die falschen Werte rausholst? ^^

    Und naja, am besten ist es wirklich du zeigst mal den Code vom Auslesen der ListBox bis hin zum senden des Befehls an die Datenbank 😉

    Grüssli



  • Hallo nochmal,
    ich hab auch versucht die Automatische Sortierung auszuschalten, hat aber trotzdem nicht gefunzt. 😞

    Also Konkret nochmal mein Problem:
    1. ich hab 2 ListBoxen.

    |-----------|             |-----------|
    | ListBox 1 |  Button ->  | ListBox 2 |
    |           |  <- Button  |           |
    |-----------|             |-----------|
    

    2. in der ersten ListBox stehen nummern drin, diese markiere ich, und schiebe dann diese Markierten Nummern per Button in die 2te ListBox (das funzt 🙂 )
    3.gleichzeitig sollen die markierten Nummern in der DB gesucht werden und zur weiterverarbeitung in einen Vector gespeichert werden.
    4. Das PROBLEM ist: keine AHNUNG?!?! Er hat wohl ein Problem mit dem String in der Variable "nummer" den ich auf die DB loslasse.
    5. Tippe ich die "nummer" von Hand ein, wie z.B. CString nummer = "0123456789012", dann gehts. Dann kann ich diese nummer auch in der DB suchen und finden.
    5.Gehe ich den Umweg über ein Textfeld (wie zuvor schonmal beschrieben) gehts komischerweise auch 😕 . Bloß wenn ich die "nummer" aus aus der ListBox auslese stellt er sich quer.

    Hier ist der code den ich gebastellt hab:

    CArray<int,int> meinAry;
    	CString nummer = "";
    	int n;
    
        CDatabase myDB;
    	CDBSet cdb(&myDB);
    
    	Veriablen ...
            ...
            ...
    	CString sValue = "";
    
    	int nCount = m_MyListBox_1.GetSelCount();
    	meinAry.SetSize(nCount);
    
    	m_MyListBox_1.GetSelItems(nCount, meinAry.GetData());
    
    	for(int i=0;i<nCount;i++)
    	{
    		n = m_MyListBox_1.GetTextLen(i);
    		m_MyListBox_1.GetText(meinAry[i], nummer.GetBuffer(n));
    
    		m_ListBox_2.AddString(nummer);	
    
    		cdb.Open(CRecordset::forwardOnly,_T( "SELECT * FROM ") + DBTABELLE + (" WHERE MatNr = ") + nummer);
    		short nFields = cdb.GetODBCFieldCount();
    
    		while(!cdb.IsEOF( ))
    		{
    			for(short index = 0; index < nFields; index++)
    			{
    				cdb.GetFieldValue(index, sValue);
    				switch(index)
    				{
                                      HIER GEHT EINIGES...
    				}
    			}
    			cdb.MoveNext();
    
    		}
    		cdb.Close();
    
               ... an der Stelle pushe ich die Daten aus der DB in einen Vector...
    
    	}
    	myDB.Close();
    

    Vielleicht weiß ja jemand Rat. Danke schonma im voraus !!



  • Erstens: CListBox::GetText() gibt es auch für CString's - ist eventuell günstiger als wenn du dir über GetBuffer() einen char* holen mußt.

    Zweitens: Wenn du wirklich der Meinung bist, GetBuffer() zu verwenden, solltest du diesen Puffer auch wieder zurückgeben (per ReleaseBuffer()), bevor du sinnvoll mit dem String arbeiten kannst.

    Drittens: Bei Problemen zur Laufzeit ist es immer praktisch, wenn du die Funktion mal im Debugger durchläufst.



  • jo wollt ich auch grad drauf hinweisen

    CListBox::GetText() gibt es auch für CString's

    und auch würd ich es machen wie (D)Evil schon drauf hingewiesen hat den string formatieren

    strNumber.Format(_T("SELECT * FROM \'%s\' WHERE Nr = \'%s\'"), DBTABELLE, strNumber);


  • Mod

    strNumber.Format(_T("SELECT * FROM \'%s\' WHERE Nr = \'%s\'"), DBTABELLE, strNumber);

    So etwas fordert SQL Code Injection ja geradezu heraus!!!
    Wenn es eine Nummer ist dann sollte auch nur eine Nummer einformatiert werden (%d und atoi verwenden).
    Ein Text wie er hier für Nr eingesetzt werden soll dann muss hier unbedingt eine Ersetzung von Single-Quotes erfolgen. Andernfalls ist hier Missbrauch Tür und Tor geöffnet!



  • So Jungs,

    es funktioniert !!! 😃

    anstatt:

    m_MyListBox_1.GetText(meinAry[i], nummer.GetBuffer(n));
    

    hab ich die Variante ohne Buffer versucht:

    m_MyListBox_1.GetText(meinAry[i], nummer);
    

    (kam da von alleine vorher nicht drauf, hehe 🙄 )

    BIG THX an alle die geholfen haben !!!

    Bis denn

    Slawo


Anmelden zum Antworten