Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » listenelement mit datensätzen aus datenbank füllen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
08.12.2004, 15:01 Uhr
~sashka
Gast


Wie ich schon in einem anderen thread gepostet habe, habe ich probleme mein listenelement zu füllen! Wenn ich es "per Hand" fülle, klappt es ohne probleme:

entweder so:

C++:
    LV_ITEM lvItem;
    lvItem.mask=LVIF_TEXT|LVIF_IMAGE|LVIF_STATE;
    lvItem.state=0;
    lvItem.stateMask=0;
    lvItem.iImage=0;

    lvItem.iItem=0;
    lvItem.iSubItem=0;
    lvItem.pszText="Element 0";
    m_list.InsertItem(&lvItem);
    m_list.SetItemText(0,1,"Unterelement 0.1");
    m_list.SetItemText(0,2,"Unterelement 0.2");





oder so:


C++:

LV_ITEM lvitem;
    lvitem.mask=LVIF_TEXT|LVIF_IMAGE|LVIF_STATE;
    lvitem.state=0;
    lvitem.stateMask=0;
    lvitem.iImage=0;
    lvitem.iItem=0;
    lvitem.iSubItem=0;


    char* name[]={"Müller","Schulz","Pascha","Sultan","Pakhtun","Zalem"};
    char* nummer[]={"12541","45874","78541","23654","41254","36214"};


      for(int j=0; j<6; j++)
          {
          lvitem.iItem=0;
          lvitem.pszText=name[j];
          lvitem.iSubItem=0;
          int itemNr=m_list.InsertItem(&lvitem);
          lvitem.iItem=itemNr;
          lvitem.iSubItem=1;
          lvitem.pszText=nummer[j];
          m_list.SetItem(&lvitem);
          }




so funktioniert es ohne Probleme, wenn ich nun aber meine Datenbank abfrage (habe eigentlich keine Ahnung davon, habe das aus dem Buch Visual C++ .net Compendium, dort wurde es dann allerdiings in ein edit-feld ausgegeben), funktioniert es nicht, hatte es zunächst folgendermaßen probiert:


C++:
    LV_ITEM lvitem;
    lvitem.mask=LVIF_TEXT|LVIF_IMAGE|LVIF_STATE;
    lvitem.state=0;
    lvitem.stateMask=0;
    lvitem.iImage=0;
    lvitem.iItem=0;
    lvitem.iSubItem=0;

    DDX_TEXT(pDx,IDC_LIST1,lvitem.pszText=m_pSetm_041206_RevGuelt_InfosAnfang);
    m_list.InsertItem(&lvitem);






und als das dann nicht ging, habe ich es folgendermaßen probiert, was aber auch nicht funktionierte:


C++:

    LV_ITEM lvitem;
    lvitem.mask=LVIF_TEXT|LVIF_IMAGE|LVIF_STATE;
    lvitem.state=0;
    lvitem.stateMask=0;
    lvitem.iImage=0;
    lvitem.iItem=0;
    lvitem.iSubItem=0;


    string test;
    test=m_pSet->m_041206_RevGuelt_InfosAnfang.GetString();
    lvitem.pszText=&test;
    m_list.InsertItem(&lvitem);




Ich arbeite mit dem Visual Studio .net und das was ich hier jetzt mache ist eigentlich nur vorarbeit zum "testen", eigentlich sollen noch einige abfragen und vergleiche durchgeführt werden, aber ERST mal muss ich die datensätze ja überhaupt ausgeben können...! Es ist eine Access-Datenbank, die mittels ODBC-Schnittstelle verbunden(!?) ist...wenn noch fragen offen sind, stellt sie mir ;-)


Ich hoffe, ihr könnt mir weiterhelfen ;-)


Sashka
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
10.12.2004, 06:50 Uhr
~sashka
Gast


weiß denn keiner, wie das geht!? *heul*

falls noch mehr angaben benötigt werden, fragt doch, aber ignoriert mich doch nicht so einfach..... :-(
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
10.12.2004, 08:15 Uhr
~sashka
Gast


sooooo, so 'nen bisschen klappt es jetzt, also den ersten wert kann ich schon mal anzeigen lassen, aber danach geht nix mehr :-(

Hier ist mein Code:


C++:
        CDatabase db;
   db.OpenEx( NULL, CDatabase::forceOdbcDialog );

   CRecordset rs( &db );
   rs.Open( CRecordset::forwardOnly, _T( "SELECT ITEMREV_OBID FROM 041206_MatVersionen_Infos" ) );

  CString Wert;


   int n =5;//rs.GetODBCFieldCount( );


for( int i = 0; i < n; i++ ) {

         rs.GetFieldValue( i, Wert);

    m_list.InsertItem(i,Wert);

    m_list.SetItemText(i,1,"Unterelement 1");
    m_list.SetItemText(i,2,"Unterelement 2");
    


    //rs.MoveNext( );    
   }

   rs.Close( );
   db.Close( );



Ich wollte erst einmal nur 5 Datensätze abrufen, aber sobald in "i" eine eins und keine 0 mehr steht, gibt es folgenden Fehler: "Ungültiger Feldname oder Feldindex"

Kann mir jetzt vielleicht jemand weiterhelfen?? ;-)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
10.12.2004, 11:00 Uhr
~sashka
Gast


so, hab' das jetzt zum laufen gebracht, dachte das funktioniert so nicht, weil die CPU-Auslastung immer auf 100% ging, aber das scheint wohl normal zu sein(!?)
Und 'nen FEnster ging auch nicht auf.....aber bei 'nen paar millionen datensätzen in der Datenbank scheint das wohl normal zu sein....!

Nun meine Frage, warum werden die Datensätze in meinem Listenelement in der falschen reihenfolge anzeigt?? also das letzte ist ganz oben und das erste ist ganz unten...???


C++:
    CDatabase db;
   db.OpenEx( NULL, CDatabase::forceOdbcDialog );

   CRecordset rs( &db );
   rs.Open( CRecordset::forwardOnly, _T( "SELECT OBID FROM 041206_MatWirdVerwendetRel_Infos" ) );

  CString Wert;


   int n =rs.GetODBCFieldCount( );
while( !rs.IsEOF() )
{

for( int i = 0; i < n; i++ ) {

         rs.GetFieldValue( i, Wert);

    m_list.InsertItem(i,Wert);

    m_list.SetItemText(i,1,"Unterelement 1");
    m_list.SetItemText(i,2,"Unterelement 2");
    
    }

    rs.MoveNext();    
   }

   rs.Close( );
   db.Close( );




}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
10.12.2004, 13:59 Uhr
~mike
Gast


Hi!
Das hängt mit dem Index zusammen - weiß nicht mehr genau. Evntl. hilft sortieren.

mfg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
10.12.2004, 16:15 Uhr
~sashka
Gast



C++:
int i=0;
int t;
char test[100];
  pos = CStringVector.end();
while(pos != CStringVector.begin())
  {
  pos = CStringVector.end();
      pos--;
    m_list.InsertItem(i,*pos);

    t=i;
    itoa(t,test,100);
    m_list.SetItemText(i,1,test);
    CStringVector.pop_back();

    i++;
  };




in dem ausschnitt packe ich die in dem vector gespeicherten daten in das listenelement als subitem wollte ich den zähler ausgeben, da das listenelement aber keine int-zahl wollte, habe ich sie in einen string bzw. char-array umgewandelt, was aber nicht das ergebnis erzielt hat, was ich mir vorgestellt habe :-(

er gibt dort nämich folgendes aus:

0
1
2
3
4
5
6
7
8
9
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
{
|
}

da geht er dann halt die ganzen sonderzeichen durch, dann kommen die zahlen von 10 - 19 und dann gehts mit
1a
1b
1c

usw. weiter.....und damit kann ich ja nun wirklich nichts anfangen... :-(


wie könnte ich das denn realisieren???
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
11.12.2004, 17:13 Uhr
~mike
Gast


Hi!
Hab grad kein VC++ da - die MSDN hilft leider auch net. Probier mal
m_list.InsertItem(i-1,*pos);
oder
m_list.InsertItem(-1,*pos);
oder
m_list.InsertItem(0,*pos);

Irgendwie so sollte es gehen
mfg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
13.12.2004, 07:38 Uhr
~sashka
Gast



Zitat von ~mike:
Hi!
Hab grad kein VC++ da - die MSDN hilft leider auch net. Probier mal
m_list.InsertItem(i-1,*pos);
oder
m_list.InsertItem(-1,*pos);
oder
m_list.InsertItem(0,*pos);

Irgendwie so sollte es gehen
mfg


Erst mal danke für deine Antwort und sorry, das ich erst jetzt Antworte, aber mein Internet zu Hause funktioniert nicht richtig und dehalb kann ich erst jetzt wieder reinschauen...

mmmhhhh...........ich glaube du hast durch mein quellcode noch nicht ganz durchgefunden....oder ich verstehe mein eigenen code nicht

Wenn ich das so mache:


C++:
m_list.InsertItem(i-1,*pos);



dann verringer ich doch den zähler, der die stelle im listenelement bestimmt um 1....denn i ist die position im Listenelement und *pos ist eben der Zeiger auf die Stelle in dem Vector wo der entsprechende String gespeichert ist...!

Es müsste wenn ja etwas bei


C++:
    t=i;
    itoa(t,test,100);
    m_list.SetItemText(i,1,test);



verändert werden, denn der Zähler soll ja im SubItem ausgegeben werden...nur weiß ch nicht, was ich da verändern könnte.... es müsste ja irgendwas bei der konvertiertung schief gegangen sein ,weil in 'nem int kann ja kein abc und so stehen...!


Gruß
Sashka
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
13.12.2004, 08:07 Uhr
deKeep



hmmm...

interessant!

test=m_pSet->m_041206_RevGuelt_InfosAnfang.GetString();

diese zeile klingt sehr spannend und für mich vertraut, ich hab leider nicht die zeit die quellcode alle nachzuvollziehen, aber ich hab so das gefühl, dass du eine einfache methode übersehen hast!

wenn du eingabefelder hast, dann kann du sie direkt über den zeiger mit einer membervariablen ansprechen, das geht schnell und verbraucht wenig speicher!

also klassenassi auf und entsprechendes element mit einer über m_pSet->direkt verbinden, da steht dann auch beim beginn gleich der richtige datensatz und braucht auch nicht mehr behandelt werden, da er immer aktuell bleibt!

vielleicht hilft es dir ja was, du scheinst ja schon viel weiter zu sein, ich bin aber erst seit gestern hier aktiv, konnte daher nicht früher was dazu schreiben!

deKeep
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
13.12.2004, 10:37 Uhr
~sashka
Gast



Zitat von deKeep:
hmmm...

interessant!

test=m_pSet->m_041206_RevGuelt_InfosAnfang.GetString();

diese zeile klingt sehr spannend und für mich vertraut, ich hab leider nicht die zeit die quellcode alle nachzuvollziehen, aber ich hab so das gefühl, dass du eine einfache methode übersehen hast!

wenn du eingabefelder hast, dann kann du sie direkt über den zeiger mit einer membervariablen ansprechen, das geht schnell und verbraucht wenig speicher!

also klassenassi auf und entsprechendes element mit einer über m_pSet->direkt verbinden, da steht dann auch beim beginn gleich der richtige datensatz und braucht auch nicht mehr behandelt werden, da er immer aktuell bleibt!

vielleicht hilft es dir ja was, du scheinst ja schon viel weiter zu sein, ich bin aber erst seit gestern hier aktiv, konnte daher nicht früher was dazu schreiben!

deKeep


das habe ich nur am Anfang mit

C++:
test=m_pSet->m_041206_RevGuelt_InfosAnfang.GetString();



probiert, nur da ich mich damit eigentlich überhaupt nicht auskenne und das jetzt gerade erst versuche zu lernen, habe ich es jetzt anders gelöst (siehe letzer oder vorletzter post von mir... ;-))
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: