CListCtrl und Static Text problem

Indian

Erfahrenes Mitglied
Naja, Auf jedenfall habe ich eine Liste von Produkten in CListCtrl. In der 3. Spalten sind Preise für die jeweiligen Produkte. Jedesmal wenn ein neues Produkt eingefügt wird soll die Summe der Produkte in eine Static Text Steuerelement eingefügt werden.

Das problem ist das der Ereignishandler OnLvnInsertitemBuyList mir das nicht erlaubt. Ich bekomme die items aus der liste nicht richtig angezeigt.
Komischer weise funktioniert der untenstehende code wenn ich jedesmal denn Ereignishandler von HotTrack aufrufe. D.h. immer wenn meine Maus in der CListCtrl ist wird alles schön von der CListCtrl zurückgeliefert

wie kann ich das sonst lösen ?

Code:
void CKasseDlg::OnLvnInsertitemBuylist(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
	
	CString m_Price = "";

	for (int pos = 0; pos < m_IDCBuyList.GetItemCount(); pos++)
	{
		m_Price = m_IDCBuyList.GetItemText(pos,2); // irgendwas läuft hier falsch das es nicht funktioniert 	
                      }//end for

	m_IDCTotal.SetWindowText(m_Price);

	*pResult = 0;
}
 
Zuletzt bearbeitet:
Der Handler wird ja durch eine Benutzerfunktion ausgelöst. Du kannst sicher an einer anderen Stelle (Zum Beispiel da, wo der User auf einen Button geklickt hat, um ein Item einzufügen oder so) einen entsprechenden Check und Update des Statics einfügen. Hm, ist das so verständlich ausgedrückt? (Ist heute nicht mein Tag :rolleyes: )
 
es liegt eindeutig nicht an dem Static Text feld

1. ich benutze einen Scanner welcher den barcode in der datenbank vergleicht und die ClistCtrl mit all denn nötigen informationen bzw. auch denn Preis in die CListCtrl einfügt.

2. exisitiert ein produkt nicht in der datenbank bzw. hat es keinen barcode kann ich über einen dialog manual einfach einen preis einfügen welcher auch in der CListCtrl eingefügt wird.

Deshalb ist es doch sinnvoll nach jedem insert einfach die summe zu bilden und "inseritem" soll ja das machen jedoch hat es einen bug weil die werte nachdem insert irgendwie nicht zurückgeliefert werden bzw von 30 werten nur der 2.te manchmal gar keiner zurückgeliefert wird

es liegt an dem Ereignishandler "InsertItem". Diese Funktion reagiert ja immer wenn ein Item in die CListCtrl eingefügt wird. Jetzt hat sich herausgestellt das wenn ich die Summe der Items bilde will bzw. egal welche spalte eines items auslesen möchte, einfach nicht richtig ausgelesen werden auch nicht im debug modus.

Anscheinend reagiert die "InsertItem" Ereignishandler funktion nicht so wie sie sollte. Sie wird ja jedesmal ausgeführt wenn ein Item in die CListCtrl eingefügt wird. Benutze ich einen anderen Ereignishandler z.B. wenn ich mit der Maus über eine Item bewege, wird plötzlich alles richtig addiert bzw. auch die richtigen werte alle zeilen ausgelesen.

Sagen wir mal ich füge eine Item ein und die Funktion wird aufgerufen. Ich möchte von jedem item (Artikel,Produkt) die Preise addieren und in dem Static Text feld anzeigen. Das funktioniert nicht mit der InsertItem Ereignishandler funktion... Jedoch funktioniert der ganze alogrithmus mit einer ander Funktion. Jedoch kann ich doch nicht immer mit der Maus über die ClistCtrl drüberfahren damit ich die Summer geliefert bekomme. ist doch schwachsinn

Sozusagen ich bekomme keine werte bzw. auch manchmal falsch oder auch nur 1 oder 2 werte von 30 zurück. Hat InsertItem nen Bug

Momentan habe ich es so gelöst. Das ich einen die Ereignishandler funktion SetFocus benutze die jedesmal alles addiert sobald die CListCtrl denn Focus bekommt. Nach der Kalkulation wird der Focus wieder abgegeben an irgendein anderes element. So das jedesmal eine erfolgreiche Kalkulation möglich ist. Ist doch aber schwachsinn. Frage mich nur warum InsertItem handler nicht richtig funktioniert und mir die werte zurückliefert.
 
Zuletzt bearbeitet:
Welche Funktion löst denn nun das InsertItem überhaupt aus? Setzt deinen Code da hin.

Diese Funktion reagiert ja immer wenn ein Item in die CListCtrl eingefügt wird.
Das heisst aber anscheinend nicht, dass auch die SubItems dann schon da sind. Zeig doch bitte mal deinen Code zum Einfügen des Items (mit SubItems).
 
hmm diesen verdacht habe ich auch das die Subitems noch nicht dar sind


hier der code wenn ich das item einfüge:

Code:
//************************************************************************************
//************************ Method for adding manual the price ************************
//************************************************************************************
void CKasseDlg::OnPriceInput()
{
	//show manual PriceInput dialog
	CPriceInputDlg priceDlg;
	priceDlg.DoModal();

	//positon to add item add the end
	int pos = m_IDCBuyList.GetItemCount(); 

	//add item
	m_IDCBuyList.InsertItem(pos,"1");	//Add Quantity
	m_IDCBuyList.SetItemText(pos,1,"Artikel"); //Add Articel name
	m_IDCBuyList.SetItemText(pos,2,priceDlg.GetInput());
	m_IDCBuyList.SetFocus();
}



hier der code wo dann die summe on dem 3.ten subitem (3.spalte) addiert wird:

Code:
//************************************************************************************
//*************** if item added in CListCtrl this Method will calculate  *************
//************************* and display the new price ********************************
//************************************************************************************
void CKasseDlg::OnNMSetfocusBuylist(NMHDR *pNMHDR, LRESULT *pResult)
{
	CString m_Price = "";
    double m_Total = 0;
	for (int pos = 0; pos < m_IDCBuyList.GetItemCount(); pos++)
	{
		double m_Double = 0;
		m_Price = m_IDCBuyList.GetItemText(pos,2);
		m_Price.Replace(",",".");
		m_Double = atof(m_Price);
		m_Total += m_Double;
		m_Price.Format(_T("%.2f"), m_Total);		
	}//end for

	m_Price.Replace(".",",");
	m_IDCTotal.SetWindowText(m_Price);
	m_IDCBarcode.SetFocus();

	*pResult = 0;
}
 
Wie es aussieht erstellst du keine Subitems,sonder gibts den nicht vorhandenen einfach eine Beschriftung.

Code:
m_List.InsertItem(0,"1.Spalte);
m_List.SetItem(0,1,LVIF_TEXT,,"2.Spalte",0,0,0,0);
m_List.SetItem(0,2,LVIF_TEXT,"3. Spalte",0,0,0,0);

also nicht .SetItemText sondern nur SetItem verwenden

du verwendest es so:

Code:
BOOL SetItem(
              int nItem,
               int nSubItem,
              UINT nMask,
              LPCTSTR lpszItem,
              int nImage,
              UINT nState,
              UINT nStateMask,
              LPARAM lParam );

Hoffentlich hilft es dir
 
Zuletzt bearbeitet:
Nein, das stimmt so nicht. Wenn die entsprechenden Spalten da sind, kann auch der (Sub-) Itemtext gesetzt werden. Die Verwenden von SetItemText() für die Subitems ist vollkommen in Ordnung. Beispiel aus meinem Testcode:
Code:
  m_ctlList.InsertItem(  0, "Hoshi" );
  m_ctlList.SetItemText( 0, 1, "123" );
  m_ctlList.SetItemText( 0, 2, "111111" );
Indians Problem ist sehr wahrscheinlich der Ablauf. Das Ändern eines Items führt meiner Meinung nach zu früh zum Aufruf der Aktualisierungsschleife, also bevor die entsprechenden Subitems gesetzt sind.

Voschlag: Nimm den Itemchange-Code (das mit der Zählschleife) komplett raus und tu ihn in eine seperate Methode z.B. namens UpdatePrice(). Die rufst du dann nicht aus einem OnChange-Handler oder so auf, sondern nach der Stelle, wo das Einfügen ausgelöst wurde:
Code:
void CKasseDlg::OnPriceInput()
{
	//show manual PriceInput dialog
	CPriceInputDlg priceDlg;
	priceDlg.DoModal();

	//positon to add item add the end
	int pos = m_IDCBuyList.GetItemCount(); 

	//add item
	m_IDCBuyList.InsertItem(pos,"1");	//Add Quantity
	m_IDCBuyList.SetItemText(pos,1,"Artikel"); //Add Articel name
	m_IDCBuyList.SetItemText(pos,2,priceDlg.GetInput());
	m_IDCBuyList.SetFocus();

        // hier Update auslösen
        UpdatePrice(); 
}

Übrigens möchte ich um Entschuldigung bitten, das ich mich hier noch nicht früher geäussert habe -- hatte es schlichtweg vergessen. :rolleyes:
 
danke kachelor

diese idee hatte ich auch und muss es wohl auch so machen. hatte gehofft das es evtl. doch noch geht. Das problem ist ich muss diese Methode an verschiedenen Stelle aufrufen.

AutoScan
Manuales einfügen bzw. auch subtrahieren... usw...

:rolleyes:
 

Neue Beiträge

Zurück