Jag har en listView med kryssrutor. listViewn fyll supp ifrån databasen. Matchar indexen i listviewn raden i tabellen? <code> det verkar inte som du har så många rader i din tabell då... Det har verkar vara lika jobbigt som med treeViewn(mail kommer) Din data verkar inte stämma. Om du får 1 så betyder ju det att du bara har en rad i tabellen. Om du sedan har fyra rader i listviewn så kommer den ju försöka ta bort en massa rader som inte existerar i tabellen. Om du kör vs.net eller nån miljö som stödjer debugging så borde du ta en titt på varför din tabell bara har en rad. Nånting verkar lite skumt här... Nja det stämmer ju faktsikt.Deleta ikryssade namn i listview
Nu skulle jag villja ha det så, att om jag kryssar i flera stycken, så skall dessa deletas i databasen.
När jag bara skall ta bort en så fungerar ju detta:
<code>
uppdatera=false;
tabort=true;
ny=false;
ds.Tables["frånProspects"].Rows[0].Delete();
</code>
Men jag får problem när jag vill ta bort flera:
Så här försöker jag:
<code>
int rader=listView1.CheckedItems.Count;
foreach( ListViewItem item in listView1.Items )
{
if(item.Checked==true)
{
for(int a = 0;a<rader;a++)
{
ds.Tables["frånProspects"].Rows[a].Delete(); }
}
UppdateraDatabasen();
uppdatera=false;
tabort=true;
ny=false;
}
</code>
Jag får ett error:
<code>
An unhandled exception of type 'System.IndexOutOfRangeException' occurred in system.data.dll
Additional information: Det finns ingen rad på positionen 1.
</code>
Hur bör jag göra?
Sv: Deleta ikryssade namn i listview
i så fall borde du väl kunna göra typ:
<code>
int rader=listView1.CheckedItems.Count;
for(int i=rader;i>=0;i--) //räkna baklänges om du vill ta bort i listviewn samtidigt... dvs om den inte är databound eller nåt
{
if(listView1.Items[i].Checked)
{
ds.Tables["frånProspects"].Rows[i].Delete();
listView1.Items.RemoveAt(i); //ta bort ur listviewn
}
}
UppdateraDatabasen();
uppdatera=false;
tabort=true;
ny=false;
</code>Sv: Deleta ikryssade namn i listview
An unhandled exception of type 'System.IndexOutOfRangeException' occurred in system.data.dll
Additional information: Det finns ingen rad på positionen 2.
</code>
Detta har jag fått hela eftermiddagen.Sv: Deleta ikryssade namn i listview
testa att skrivat ut ds.Tables["frånProspects"].Rows.Count.ToString();
och se hur många rader du har...
Antalet rader i tabellen måste ju matcha antalet rader i listviewn...Sv: Deleta ikryssade namn i listview
När jag gör som du ville:
<code>
MessageBox.Show(ds.Tables["frånProspects"].Rows.Count.ToString());
</code>
(Detta gjorde jag i loppen) dä fick jag svaret 1, Om jag lade den utaför loppen, så var det samma svar. Jag antar att det är här som det krabbar).
Så här ser det ut nu:
<code>
int rader=listView1.CheckedItems.Count;
for(int i=rader;i>=0;i--) //räkna baklänges om du vill ta bort i listviewn samtidigt... dvs om den inte är databound eller nåt
{
if(listView1.Items[i].Checked)
{
try
{
ds.Tables["frånProspects"].Rows[i].Delete();
listView1.Items.RemoveAt(i); //ta bort ur listviewn
}
catch(Exception fel)
{
MessageBox.Show(fel.Message,"Databasfel i Radera Kund");
}
}
}
UppdateraDatabasen();
UppdateraInfo();
FyllPåListView();
uppdatera=false;
tabort=true;
ny=false;
</code>
Jag får error:
"Det finns ingen rad på possition 2
Det finns ingen rad på possition 1
Det angavs ingen kommandotext.."
Jag har inte lagt in mera än fyra poster för att testa med men det borde väll fungera iallafall?
Ingenting blir deletat.Sv: Deleta ikryssade namn i listview
Sv: Deleta ikryssade namn i listview
När jag gör så här:
<code>
MessageBox.Show(listView1.Items[i].Text);
</code>
så får jag fram namnen på de markerade.
När man räknar( som du föreslog) då kan det ju bara vara ett, han tar ju bara en i sänder.
<code>
MessageBox.Show(ds.Tables["frånProspects"].Rows.Count.ToString());
</code>
Jag tror att jag vet vad felet är, jag skickar ju vidare till uppdatera databasen, och har där en sql som tar bort.
<code>
string namn = textBoxNamn.Text;
if(ny==true)
{
sqlInsert= ("Insert INTO t_Prospects(Namn,Epost)VALUES( '" + namn + "','" + epost + "')");
// lite kod
OleDbCommand mDeleteCommand=new OleDbCommand(sqlDelete,con);
con.Open();
OleDbDataAdapter mAdapter=new OleDbDataAdapter(); //här läggs classen
mAdapter.DeleteCommand = mDeleteCommand;
mAdapter.Update(ds,"frånProspects");
con.Close();
</code>
Jag jämmför ju med vad som står i en textruta.
Jag misstänker att jag måste göra en public string, och läsa av namnet ifrån listViewn.
Vad tror du?
[REDIGERAT]
Jag har löst problemet.
Jag gjorde en public string, som jag i loppen fick läsa av namnet på posten i listViewn, sedan så körde jag som vanligt.
Fungera kanon.
Tack för hjälp