webForumDet fria alternativet

Problem med dubbla poster i listView

8 svar · 602 visningar · startad av saw

sawMedlem sedan mars 20011 880 inlägg
#1

Jag försöker att fixa till så att jag inte får några dubbla poster i min listView.
Så här var koden innan och fungerade perfekt.

listView1.View = View.Details;
listView1.Columns.Clear();
listView1.Refresh();
listView1.Columns.Add("Akord ifrån " + cmbOrginal.Text, 76, HorizontalAlignment.Left);
listView1.Columns.Add("Akord till " + cmbNydur.Text, 76, HorizontalAlignment.Left);

string sUtokad = cmboUtokad.Text;
if (cmboUtokad.Text == "inget")
sUtokad = "";
else
sUtokad = cmboUtokad.Text;

ListViewItem myNewItem = new ListViewItem();
myNewItem.Text = cmbAckord.Text + sUtokad;
                       
myNewItem.SubItems.Add(txtNyttAckord.Text);
listView1.Items.Add(myNewItem);

Nu ville jag försöka att få bukt med dubletter

 listView1.View = View.Details;
 listView1.Columns.Clear();
 listView1.Refresh();

 listView1.Columns.Add("Akord ifrån " + cmbOrginal.Text, 76, HorizontalAlignment.Left);
listView1.Columns.Add("Akord till " + cmbNydur.Text, 76, HorizontalAlignment.Left);

string sUtokad = cmboUtokad.Text;
if (cmboUtokad.Text == "inget")
sUtokad = "";
else
sUtokad = cmboUtokad.Text;

ListViewItem myNewItem = new ListViewItem();
myNewItem.Text = cmbAckord.Text + sUtokad;
//här kommer ändringen
if (listView1.Items.Count > 0)
{
ListViewItem lvItem = listView1.FindItemWithText(myNewItem.Text, false, 0, true);
if (lvItem.SubItems[1] != null)
{
 MessageBox.Show("Ackorder finns");
}
else
{
myNewItem.SubItems.Add(txtNyttAckord.Text);
listView1.Items.Add(myNewItem);
}
}
else
{
myNewItem.SubItems.Add(txtNyttAckord.Text);
listView1.Items.Add(myNewItem);
}

Nu får jag error iställer...
Objectsreferensen har inte angetts till en instans av ett object
Några bra förslag???
:q

cokMedlem sedan dec. 2005664 inlägg
#2

Man kan ju titta på den raden dä det smäller, och se vilket objekt som inte är instansierat.

sawMedlem sedan mars 20011 880 inlägg
#3

Den smäller här:

 listView1.Items.Add(myNewItem);

..men den är ju redan instanserad.

sawMedlem sedan mars 20011 880 inlägg
#4

JAg försöker på ett annat vis

if (listView1.Items.Count > 0)
                        {
                            foreach (ListViewItem lvi in listView1.Items)
                            {
                                    if (txtNyttAckord.Text != lvi.SubItems[1].Text)
                                {
                                    myNewItem.SubItems.Add(txtNyttAckord.Text);
                                    listView1.Items.Add(myNewItem);
                                }
                                else
                                {
                                    MessageBox.Show("Dubblett");
                                }
                            }
                        }
                        else 
                        {
                            myNewItem.SubItems.Add(txtNyttAckord.Text);
                            listView1.Items.Add(myNewItem);
                        }

Nu får jag inga felmedelande. Via messageboxen så kan jag se om jag försöker
lägga till dubbletter, men jag får dubblett i alla fall... §jr

PhorpherMedlem sedan feb. 20002 300 inlägg
#5

I den första koden du postade så smäller det här:

...
ListViewItem lvItem = listView1.FindItemWithText(myNewItem.Text, false, 0, true);
if (lvItem.SubItems[1] != null)
{
...

Om FindItemWithText inte hittar någon ListViewItem som matchar din sökning så returneras null. Efter det så kollar du om lvItem.SubItems[1] är null men vad händer om lvItem är null (FindItemWithText kanske inte hittade någon dublett)? Då försöker du komma åt SubItems[1] på ett objekt som är null. Kommer inte gå så bra va? :)

I ditt andra exempel har du ju mer eller mindre gjort en egen enkel FindItemWithText fast du kollar inte alla ListViewItems innan du lägger till myNewItem. Om du gör enligt ditt andra exempel så måste du först iterera genom alla items i din lista och kolla om något av dem är detsamma som du försöker lägga till. Om det inte finns någon dublett, lägg till en ny ListViewItem i listan.

sawMedlem sedan mars 20011 880 inlägg
#6

Jag har vänt och tråklat letat/sökt men jag står helt bortkollrad..

if (listView1.Items.Count == 0)
                {
                    myNewItem.SubItems.Add(txtNyttAckord.Text);
                    listView1.Items.Add(myNewItem);
                }
                else
                {
                    ListViewItem lvItem = listView1.FindItemWithText(myNewItem.Text, false, 0, true);
                    if (lvItem.SubItems[1] == null)
                    {
                        myNewItem.SubItems.Add(txtNyttAckord.Text);
                        listView1.Items.Add(myNewItem);
                    }
                    else if (lvItem.SubItems[1] != null)
                    {
                        MessageBox.Show("Ackorder finns");
                    }
                }

..även om detta är anorlunda än första, så ger den samma resultat.
Dax at ge upp? :q

PhorpherMedlem sedan feb. 20002 300 inlägg
#7

saw skrev:

..även om detta är anorlunda än första, så ger den samma resultat.
Dax at ge upp? :q

Du gör fortfarande samma fel:

ListViewItem lvItem = listView1.FindItemWithText(myNewItem.Text, false, 0, true);
if (lvItem.SubItems[1] == null)
...

Du anropar FindItemWithText för att hitta en nod i listView1 som innehåller texten myNewItem.Text. Om inte FindItemWithText hittar något som innehåller det du söker kommer den att returnera null. Dvs. lvItem kommer att vara null.

I if-satsen skriver du lvItem.SubItems[1] men om lvItem är null så finns inte det någon SubItems och du kommer att få ett NullReferenceException.

Din if-sats ska vara:

if(lvItem == null)
  // Lägg till noden
else
  // Noden fanns redan
sawMedlem sedan mars 20011 880 inlägg
#8

Givetvis jag hängde upp mig på subitem.
Tack för din hjälp.

sawMedlem sedan mars 20011 880 inlägg
#9

Mina error låter inte vänta på sig...

listView1.View = View.Details;
                listView1.Columns.Clear();
                listView1.Refresh();

                listView1.Columns.Add("Akord ifrån " + cmbOrginal.Text, 76, HorizontalAlignment.Left);//här blir det fel
                listView1.Columns.Add("Akord till " + cmbNydur.Text, 76, HorizontalAlignment.Left);

                string sUtokad = cmboUtokad.Text;
                if (cmboUtokad.Text == "inget")
                    sUtokad = "";
                else
                    sUtokad = cmboUtokad.Text;

                ListViewItem myNewItem = new ListViewItem();
                myNewItem.Text = cmbAckord.Text + sUtokad;

                if (listView1.Items.Count == 0)
                {
                    myNewItem.SubItems.Add(txtNyttAckord.Text);
                    listView1.Items.Add(myNewItem);
                }
                else
                {
                    ListViewItem lvItem = listView1.FindItemWithText(myNewItem.Text, false, 0, true);
                    if (lvItem == null)
                    {
                        myNewItem.SubItems.Add(txtNyttAckord.Text);
                        listView1.Items.Add(myNewItem);
                    }
                    else
                    {
                        toolStripStatusAktion.Text = "Ackordet finns redan";
                    }
                }

Error: Objectsreferensen har inte angetts till en instans av ett object.
Debugen reagerar tydligen när jag lägger till mina columner. Är det galet som
jag gör??? :r

[EDIT]
Jag la koden för kolumnerna i en annan klas och då löste det sig

136 ms totalt · 3 externa anrop · v20260731065814-full.102f7fcd
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)