ListView,contextmenu e eliminazione elemento

sabato 06 agosto 2005 - 01.46

astroman Profilo | Junior Member

Sto utilizzando un DataListView per visualizzare i dati da un db..ora ho aggiunto un contextmenu: quando faccio per eliminare un record lo elimina dal db, la procedura và tutto correttamente...solo che quando esce dal metodo và in errore...ma non riesco a capire cosa devo fare e perchè va in errore...
Allora l'errore che VS.Net 2003 mi dà è

An unhandled exception of type 'System.ArgumentOutOfRangeException' occurred in system.windows.forms.dll
Additional information: Specified argument was out of the range of valid values.

il listview lo apro così', in modo tale da far aprire il contextmenu in relazione di un elemento selezionato:

private void Control_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
ListViewItem lvItem=new ListViewItem();
lvItem=this.dl.GetItemAt(e.X,e.Y);
if (e.Button==MouseButtons.Right && lvItem!=null)
{
lvItem.Selected=true;
this.contextMenu.Show(dl,new Point(e.X,e.Y));
}
}

niente di eccezzionale fino a quà..ho aggiunto il menuitem "elimina" e il codice è il seguente:

private void mnuElimina_Click(object sender, System.EventArgs e)
{
SelItem="";
int SelIndex=-1;
ListView.SelectedListViewItemCollection SL = this.dl.SelectedItems;
foreach (ListViewItem item in SL)
{
SelItem=item.SubItems[0].Text;
SelIndex=item.Index;
}
if (SelItem!="")
{
cn=new OleDbConnection(Connection.Active());
cn.Open();
cmd=new OleDbCommand("DELETE FROM _Current_AzioniGioco WHERE id=" + SelItem,cn);
cmd.ExecuteNonQuery();
cmd.Cancel();
cn.Close();
LoadList();
}
}
Dove il LoadList() è un metodo dove ricarico il DataListView.In pratica quando arriva della procedura sopraindicata mi da l'errore sopracitato...ho provato di tutto, a cancellare l'elemento ecc ecc...ma niente da fare...va sempre e comunque in errore...

Qualcuno mi da una mano?Sono abbastanza sul disperato perchè non riesco a trovare uno straccio di soluzione...

Cteniza Profilo | Guru

Al posto di rigenerare la listview io toglierei solamente l'elemento cancellato.
Sospetto che l'errore avvenga proprio a causa della rigenerazione



astroman Profilo | Junior Member

beh in effetti lo sospetto anche io..il problema è...che dovrei ricaricare in ogni caso la datalistview, poichè è aggiornata con il db.
In ogni caso faccio il problema è un problema alquanto strano, poichè utilizzo la stessa tipologia per l'eliminazione un pò dappertutto ma senza il contextmenu e funziona...
Ma se elimino l'elemento, dopo non rischio di avere dei dati disalineati con il database sul listview?


astroman Profilo | Junior Member

No, niente da fare...ho provato a toglire la rigenerazione della listview, come ho visto in moltissimi esempi, ma niente da fare..continua a darmi errore quando esce dal metodo.
Ho provato a modificarlo in questo modo:

private void mnuElimina_Click(object sender, System.EventArgs e)
{
SelItem="";
int SelIndex=-1;
ListView.SelectedListViewItemCollection SL = this.dl.SelectedItems;
foreach (ListViewItem item in SL)
{
SelItem=item.SubItems[0].Text;
SelIndex=item.Index;
}
if (SelItem!="")
{
cn=new OleDbConnection(Connection.Active());
cn.Open();
cmd=new OleDbCommand("DELETE FROM _Current_AzioniGioco WHERE id=" + SelItem,cn);
cmd.ExecuteNonQuery();
cmd.Cancel();
cn.Close();
//LoadList();
dl.Items[SelIndex].Remove();
}
}

Non pensavo che fosse così complicato usare i contextmenu...se non trovo una soluzione mi vedrò costretto a non poterlo utilizzare...
Idee in proposito?Io le ho finite sinceramente...

Cteniza Profilo | Guru

Se tu potessi inserire un esempio "non funzionante" in modo tale da poterci fare dei tests sopra sarebbe un passo avanti.


astroman Profilo | Junior Member

In che senso?
Beh per chiarezza...ho allegato direttamente il form interessato e il componente che mi son fatto per il datalistview, il quale l'ho creato (anzi scaricato già pronto...) dal sito Microsoft: il sorgente si trova qui http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnadvnet/html/vbnet08262002.asp.
Beh logicamente il form non funziona per il collegamento con il db...ma se lo si "attacca" a qualsiasi db che si ha per fare un semplice test con una tabellina..beh il risultato è quello, tanto non c'è praticamente nulla su quel form.

Se hai un'idea...ti sarei infinitamente grato!:D

Cteniza Profilo | Guru

Devi zippare il tutto, altrimenti è impossibile scaricarlo

astroman Profilo | Junior Member

Urca, è vero non me ne ero accorto, scusa..

Cteniza Profilo | Guru

Ho fatto delle prove con la tua situazione non con i tuoi dati perchè non ho le tue tabelle.
Considerazione: visto che NON utilizzi il databinding cosa te ne fai di una listview modificata per gestire il binding?.
Ho quindi provato con una listview normale, non ho ottenuto nessun errore, l'elemento veniva rimosso correttamente.
Sei sicuro che il problema sia dato dall'operazione di cancellazione dell'elemento e non dall'uso "anomalo" che fai di un oggetto modificato per gestire il databinding utilizzato senza il databinding?.
Io farei delle prove semplicemente sostituendo l'oggetto listview (datalistview) con una listview "originale".


Cteniza Profilo | Guru

Scusa, mi è sfuggito il click, inoltre ti consiglio di intercettare con try / catch (è buona norma intercettare sempre gli errori) e farti vedere lo stacktrace che al 90 % ti indica correttamente l'errore e la riga del sorgente che l'ha generato.
Magari scopri che l'errore è dovuto alla connessione / gestione della connessione / comando cancellazione dati e che la datalistview non c'entra niente.



astroman Profilo | Junior Member

Beh potrebbe anche essere, non dico di no...ma come faccio a legare ad una listview classica i dati di un db scusa?
La listview non lo permette...o ho capito male io?

astroman Profilo | Junior Member

Beh effettivamente avevo messo un try/catch sul metodo di eliminazione del db...ma passava avanti correttamente!

Umm,..interessante il discorso dello stack trace...non sono molto forte in debug...mi spieghi meglio, se puoi,come usarlo?

Cteniza Profilo | Guru

Utilizzare il databinding vuol dire "non dire mai mi dispiace :)) ", a parte le battute la datalistview è stata ricavata dalla listview classica in modo tale da poter essere "bindata"
Il che vuol dire che tu hai legato la costruzione delle righe (items) della listview con una fonte dati (tabella) capace di implementare IList, la listview in questo modo si autodimensiona secondo quante datarow contiene.
In definitiva quello che dovresti cancellare NON è l'item, non lo dovresti MAI cancellare direttamente ma dovresti agire, come per gli altri oggetti bindati sulla loro fonte dati.
Quindi è sulla tabella, fonte dati della listview, che devi inserire, cancellare, modificare le righe e di conseguenza, la listview rappresentando un'immagine delle righe collegate dovrebbe applicare le modifiche introdotte.


astroman Profilo | Junior Member

E si in effetti sta qui il mio cruccio...l'oggettino molto caruccio che mi fa il binding della listview lo utilizzo almeno su altre 30 form e faccio di tutto...aggiorno, inserisco ed elimino righe sempre nello stesso modo...è solo questo cavolo di contextmenu che mi da questi problemi..e non riesco a capirne il motivo...

Secondo te...che mi conviene fare?
Ho provato a rimettere il try/catch...ma non entra neanche nel metodo "LoadList()"...quindi non chiama neanche l'eliminazione dell'elemento...boh...non capisco proprio...

astroman Profilo | Junior Member

Ho un'aggiornamento che potrebbe essere rilevante...ho messo un try/catch sul main dell'applicativo dove mi dà l'errore...solo che ora mi mette che

"Parameter name:'1' is not a valid index for displayIndex"

Vallo a capire te cosa mi và in errore...in pratica è un errore di reassignamento degl'indici...boh..

astroman Profilo | Junior Member

ho trovato a cosa fà riferimento sto benedetto "displayIndex", praticamente a questo:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemWindowsFormsListViewListViewItemCollectionClassItemTopic.asp

Alla ListViewItemCollection...ma non riesco a capire cosa dovrei modificare o come gestirla...

ale75fly Profilo | Newbie

ho avuto lo stesso problema ed ho perso almeno mezza giornata di lavoro per risolverlo!!! grazie a questo post ho avuto l'intuizione giusta, il problema sta esattamente nell'interazione tra context menu e listview. Quando si clicca una voce del context menu, una volta sparito il menu, appare il rettangolo di selezione della list view che solitamente appare dopo un click prolungato su di un'area vuota e scompare al rilascio del bottone del mouse. Questa cosa in qualche modo provoca problemi se da una voce di menu si esegue la cancellazione di elementi della listview. La soluzione che ho trovato è semplice ed indolore basta semplicemente aggiungere due linee di codice seguenti all'inizio dell'evento click di ogni scpecifica voce del context menu':

listviewname.Enabled = False
listviewname.Enabled = True

esempio:

private void mnuElimina_Click(object sender, System.EventArgs e)
{
ListView.Enabled = False; ListView.Enabled = True;
SelItem="";
int SelIndex=-1;
ListView.SelectedListViewItemCollection SL = this.dl.SelectedItems;
foreach (ListViewItem item in SL)
{
SelItem=item.SubItems[0].Text;
SelIndex=item.Index;
}
if (SelItem!="")
{
cn=new OleDbConnection(Connection.Active());
cn.Open();
cmd=new OleDbCommand("DELETE FROM _Current_AzioniGioco WHERE id=" + SelItem,cn);
cmd.ExecuteNonQuery();
cmd.Cancel();
cn.Close();
LoadList();
}
}
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5