Zum Inhalt springen

CListCtrl


bigpoint

Empfohlene Beiträge

Du erstellst eine Nachrichtenbehandlungsfunktion für LVN_ITEMCHANGED. Die sollte dann in etwa so aussehen:

[color=blue]void CDeinDialog[/color]::OnItemchangedList([color=blue]NMHDR[/color]* pNMHDR, [color=blue]LRESULT[/color]* pResult) 
{
[color=purple]NM_LISTVIEW[/color]* pNMListView = ([color=purple]NM_LISTVIEW[/color]*)pNMHDR;
if( pNMListView->uNewState & [color=purple]LVIS_SELECTED[/color] ) {
[color=green]// In pNMListView->iItem steht der Index des gewählten Items[/color]
}
*pResult = 0;
}[/CODE]

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by Klotzkopp

CListCtrl::GetItemText

Irgend wie checke ich es heute nicht mehr in MSDN steht

CListCtrl::GetItemText

int GetItemText( int nItem, int nSubItem, LPTSTR lpszText, int nLen ) const;

CString GetItemText( int nItem, int nSubItem ) const;

Return Value

The version returning int returns the length of the retrieved string.

The version returning a CString returns the item text.

Parameters

nItem

The index of the item whose text is to be retrieved.

nSubItem

Specifies the subitem whose text is to be retrieved.

lpszText

Pointer to a string that is to receive the item text.

nLen

Length of the buffer pointed to by lpszText.

Trozdem kriege ich den Inhalt nicht oder übrigens was braucht die Methode

pNMListView->iItem es ist irgend wie von java++ oder

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by 007ski

Irgend wie checke ich es heute nicht mehr in MSDN steht

CListCtrl::GetItemText

int GetItemText( int nItem, int nSubItem, LPTSTR lpszText, int nLen ) const;

CString GetItemText( int nItem, int nSubItem ) const;

Es gibt zwei Versionen dieser Methode. Die erste Version schreibt den Text in einen Puffer:

// hole Text von Item 3, SubItem 5

char szBuffer[200];

m_listctrl.GetItemText( 3, 5, szBuffer, 199 );

Die zweite Version macht es noch einfacher, sie liest den Text in ein CString-Objekt und gibt dieses zurück:

// hole Text von Item 3, Subitem 5

CString strText = m_listctrl.GetItemText( 3, 5 );

übrigens was braucht die Methode

pNMListView->iItem es ist irgend wie von java++ oder

Das ist keine Methode, sondern ein int. In diesem int steht der Index des selektierten Items.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by 007ski

...kriege ich ihn strText nur die Daten die in der spalte 5 stehen ich brauche aber alle Gibt da irgend eine Möglichkeit

Wo ist denn das Problem? :confused:

CString strText0 = m_Grid.GetItemText( item, 0 );

CString strText1 = m_Grid.GetItemText( item, 1 );

CString strText2 = m_Grid.GetItemText( item, 2 );

CString strText3 = m_Grid.GetItemText( item, 3 );

CString strText4 = m_Grid.GetItemText( item, 4 );

CString strText5 = m_Grid.GetItemText( item, 5 );

...

Oder so:

CString strGanzeZeile;
for( int i=0; i<nColumnCount; ++i ) {
strGanzeZeile += m_Grid.GetItemText( item, i );
}[/CODE]

Oder lies die Texte in ein Array von CStrings...

Link zu diesem Kommentar
Auf anderen Seiten teilen

NM_CLICK wird nur mit der Maus ausgelöst. Außerdem ist es dabei möglich, über LVM_SUBITEMHITTEST herauszufinden, ob auf ein Subitem geklickt wurde.

LVN_ITEMCHANGED wird immer ausgelöst, wenn ein Item selektiert oder deselektiert wird, egal ob das durch die Maus oder die Tastatur ausgelöst wurde. Wenn Dein List Control auch mit der Tastatur bedienbar sein soll, musst Du LVN_ITEMCHANGED verwenden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by Klotzkopp

NM_CLICK wird nur mit der Maus ausgelöst. Außerdem ist es dabei möglich, über LVM_SUBITEMHITTEST herauszufinden, ob auf ein Subitem geklickt wurde.

LVN_ITEMCHANGED wird immer ausgelöst, wenn ein Item selektiert oder deselektiert wird, egal ob das durch die Maus oder die Tastatur ausgelöst wurde. Wenn Dein List Control auch mit der Tastatur bedienbar sein soll, musst Du LVN_ITEMCHANGED verwenden.

:uli

Vielen Dank

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nach was jetzt versuche ich es so machen das bei starten des Programms der erste Satz in ClistCtr angezeigt wird dann mache ich so:

m_Grid.SetItemState(0,LVIS_SELECTED,LVIS_SELECTED|LVIS_FOCUSED);

und zwar das habe ich schon sowohl in der Methode OnItemchangedList2(NMHDR* pNMHDR, LRESULT* pResult) als in OnInitialUpdate() machen. Der Effekt ist so das erst beim einklicken wird der erste Satz aktiv und somit ist er auch immer aktiv dh. wenn ich andere Felder klicke bleibt er aktiv

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by 007ski

m_Grid.SetItemState(0,LVIS_SELECTED,LVIS_SELECTED|LVIS_FOCUSED);

Damit löschst Du explizit den Focus-State, falls das Item ihn hat. Macht nicht viel Sinn, also besser so:

m_Grid.SetItemState(0,LVIS_SELECTED,LVIS_SELECTED);

und zwar das habe ich schon sowohl in der Methode OnItemchangedList2(NMHDR* pNMHDR, LRESULT* pResult)
Das verursacht den beschriebenen Effekt: man kann kein anderes Item auswählen. Hier darfst Du das auf keinen Fall machen.

als in OnInitialUpdate() machen.
Das kommt schon eher hin. Sind da die Items denn schon eingetragen?
Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by Klotzkopp

Wie sollte das auch funktionieren? Du versuchst, das erste Item in einem List Control zu selektieren, das keine Items enthält. Du musst diese Zeile ausführen, nachdem Du das List Control mit Daten gefüllt hast.

Mache ich auch, also ich habe mich falsch ausgedruckt es ist so ich habe eine Methode in die ich das List Control mit Daten fühle sieht so aus:

void lalaView::LoadCListCtrl()

{

//Zeiger auf die Datensatzklasse

CCustomRs* pRs;

// Zeiger auf Dokumentobjekt holen

pRs = GetDocument()->GetRecSet();

//Columns in CListCtrl Deklarieren

m_Grid.InsertColumn(0, "BenutzerID", LVCFMT_LEFT, 120);

m_Grid.InsertColumn(1, "Loginname", LVCFMT_CENTER, 80);

m_Grid.InsertColumn(2, "Vorname", LVCFMT_LEFT, 120);

m_Grid.InsertColumn(3, "Nachname", LVCFMT_LEFT, 100);

m_Grid.InsertColumn(4, "Standort", LVCFMT_RIGHT, 80);

m_Grid.InsertColumn(5, "Telefon", LVCFMT_CENTER, 100);

m_Grid.SetExtendedStyle(m_Grid.GetExtendedStyle() | LVS_EX_FULLROWSELECT);

//CListCtrl mit Daten fühlen

while(!GetDocument()->m_pRs->EndOfFile){

// Umwandlung int in CString

strBenutzerID.Format( "%i", pRs->m_BenutzerID );

strStatus.Format( "%i", pRs->m_Status);

strErstelldatum.Format("%d", pRs->m_dtErstelldatum);

strLetzteAend.Format("%d",pRs->m_dtLetzteAend);

strLetzterLogin.Format("%d",pRs->m_dtLetzterLogin);

strPWGueltigBis.Format("%d",pRs->m_dtPWGueltigBis);

int nItem = m_Grid.InsertItem(0, strBenutzerID);

m_Grid.SetItemText(nItem, 1, m_strLoginname);

m_Grid.SetItemText(nItem, 2, m_strFirstName);

m_Grid.SetItemText(nItem, 3, m_strLastName);

m_Grid.SetItemText(nItem, 4, m_strStandort);

m_Grid.SetItemText(nItem, 5, m_strPhone);

GetDocument()->m_pRs->MoveNext();

RefreshBoundData();

}

ModifyStyle(NULL, LVS_REPORT, 0);

m_Grid.SetItemState(0,LVIS_SELECTED,LVIS_SELECTED);

}

und in OnInitialUpdate abrufe sollte funktionieren oder ?? Leider ist es nicht der Fall ;-(((

Da aber noch eine Frage zu while schleife die fühlt zwar das List Control mit Daten aber die BenutzerID ist Abwärts sortiert dh stat 12345 54321 ich vermute es liegt an int nItem = m_Grid.InsertItem(0, strBenutzerID); bin mir aber nicht sicher

Link zu diesem Kommentar
Auf anderen Seiten teilen

Noch zwei Probleme:

1 in meinem Programm habe ich auch Möglichkeit das der Benutzer durch ein Toolbar zum ersten letzten usw. Datensatz in Control List geht und der als aktiv markiert wird. Es funk ( fast ) nur die Spalte die ich beim Programmstart oder durch anklicken aktiv mache bleibt auch angezeigt also blau ;-( so mache ich es:

void lalaView::OnBenutzerFirst()

{

GetDocument()->MoveFirst();

// List Control Spalte aktiviren

m_Grid.SetItemState(0,LVIS_SELECTED,LVIS_SELECTED);

UpdateData(FALSE);

}

also wenn ich mein progi starte dann welle ich irgend eine spalte dann will durch Toolbar zu erste wider zurück und das Resultat es werden beide Spalten angezeigt also erste und die die ich angeklickt habe

sollte nur erste ;-((

2 ich habe auch eine Funktion Löschen die löscht den Datensatz in DB funk auch super plus nur den Datensatz wird weiter in List Control angezeigt also in DB ist gelöscht in List Control sichtbar ;-(

habe es so versucht zu lösen

m_Grid.UpdateData(FALSE);

Link zu diesem Kommentar
Auf anderen Seiten teilen

Bevor Du die neue Selektion auf den ersten Eintrag setzt, musst Du zuerst die alte Selektion entfernen:

POSITION pos = m_Grid.GetFirstSelectedItemPosition();
if( pos ) {
m_Grid.SetItemState( m_Grid.GetNextSelectedItem(pos), LVIS_SELECTED, 0 );
}[/CODE]

UpdateData bewirkt nur bei Wert/Value-Variablen den Datenaustasch zwischen Variable und Steuerelement. Bei Steuerelement/Control-Variablen wie CListCtrl macht UpdateData gar nichts.

Den gelöschten Datensatz musst Du von Hand mit CListCtrl::DeleteItem aus dem List Control enfernen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

m_Grid.DeleteItem(nItem);

funktioniert wunderbar

void lalarView::OnBenutzerFirst()

{

// Zum ersten Datensatz gehen

GetDocument()->MoveFirst();

POSITION pos = m_Grid.GetFirstSelectedItemPosition();

if( pos ) {

m_Grid.SetItemState( m_Grid.GetNextSelectedItem(pos), LVIS_SELECTED, 0 );

}

}

so wie ich es verstehe ist es so dass Du holst sich Item der zuerst selektiert wahr also 0 im meinem fall und dann setz Du ihn (Item) zurück ?

Leider funk nicht

Bevor Du die neue Selektion auf den ersten Eintrag setzt, musst Du zuerst die alte Selektion entfernen“/B]

ja schon klar aber ich weis es nicht wie ??

Link zu diesem Kommentar
Auf anderen Seiten teilen

reicht denn der Schalter LVS_SINGLESEL nicht?

(Dialog-Editor: "Einzelauswahl")

Dann sollte doch nur einer markiert sein.

ansonsten müßte es was wie:

myList.SetItemState(index, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);

doch auch als:

myList.SetItemState(index, 0 | 0, LVIS_SELECTED | LVIS_FOCUSED);

geben ... oder sowas ähnliches

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich glaube ich werde verrückt

void lalaView::OnBenutzerLast()

{

// Zum letztem Datensatz gehen

GetDocument()->MoveLast();

POSITION pos = m_Grid.GetFirstSelectedItemPosition();

int itemanzahl = m_Grid.GetItemCount();

if( pos ) {

m_Grid.SetItemState( m_Grid.GetNextSelectedItem(pos), itemanzahl, LVIS_SELECTED );

}

// List Control Spalte aktiviren

m_Grid.SetItemState(itemanzahl,LVIS_SELECTED,LVIS_SELECTED);

}

so versuche ich den Letzten Datensatz zu markieren leider ohne Erfolg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Der erste Parameter von SetItemState ist der Index des Items. Die anderen beiden regeln, was mit dem Item passiert. Der zweite ist der Wert, der dritte eine Bitmaske. Wenn Du also ein Item selektieren willst, schreibst Du:

m_ctrl.SetItemState( nItem, LVIS_SELECTED, LVIS_SELECTED );

Wenn Du die Selektion eines Items entfernen willst:

m_ctrl.SetItemState( nItem, 0, LVIS_SELECTED );

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...