2009-03-10 11 views
0

I ListView.GetItemAt(x,y) bin mit einem Element aus der ListView zurückzuholen, aber ich bin nicht der Lage, das Produkt zu erhalten, wenn ich die FullRowSelect Option false gesetzt.ein Element in einer Listenansicht abrufen

Ich bin nicht sicher, wie es in .NET 1.1 zu tun. Hat jemand irgendwelche Hinweise?

Hier ist ein Code-Schnipsel:

public int GetListViewSubItem(ListView listView1, Point pt) 
{ 
    const int LVM_FIRST = 0x1000; 
    const int LVM_GETSUBITEMRECT = (LVM_FIRST + 56); 
    const int LVIR_BOUNDS = 0; 

    RECT myrect; 
    ListViewItem lvitem = listView1.GetItemAt(pt.X, pt.Y); 
    if(lvitem == null && listView1.SelectedItems.Count > 0) 
     lvitem = listView1.SelectedItems[0]; 

    int intLVSubItemIndex = -1; 
    ListViewItem.ListViewSubItem LVSubItem = null; 

    if(lvitem != null) 
    { 
     int intSendMessage; 
     for (int i = 1; i <= lvitem.SubItems.Count - 1; i++) 
     { 
      LVSubItem = lvitem.SubItems[i]; 
      myrect = new RECT(); 
      myrect.top = i; 
      myrect.left = LVIR_BOUNDS; 
      intSendMessage = SendMessage(listView1.Handle, 
              LVM_GETSUBITEMRECT, 
              lvitem.Index, ref myrect); 
      if (pt.X < myrect.left) 
      { 
       LVSubItem = lvitem.SubItems[0]; 
       intLVSubItemIndex = 0; 
       break; 
      } 
      else if (pt.X >= myrect.left & pt.X <= myrect.right) 
      { 
       intLVSubItemIndex = i; 
       break; 
      } 
      else 
       LVSubItem = null; 
     } 
    } 

    if (LVSubItem == null || lvitem == null) 
    { 
     intLVSubItemIndex = -1; 
    } 

    return intLVSubItemIndex; 
} 

Diese Methode soll mir zeigen, welche Zelle geklickt wurde. Tt funktioniert, aber wenn ich die fullrowselect zu false ändern, gibt es einen null Wert zurück.

Ich versuchte sogar getitemat(0,e.y), aber es hat nicht funktioniert.

Immer, wenn ich ein Element in ListView auswähle, wird es mit der Farbe Blau hervorgehoben, so dass es nicht möglich ist, anzuzeigen, was ausgewählt ist. Ich versuche, das blaue Highlight zu entfernen.

Irgendwelche Gedanken?

+0

hallo du hast nichts herausgefunden –

Antwort

1

Können Sie etwas näher erläutern, was Sie zu tun versuchen?

Ist der ViewStyle Ihrer ListView auf Details eingestellt? Da Sie erwähnen, FullRowSelect auf false zu setzen, nehme ich an, dass es ist.

GetItemAt (x, y) funktioniert nur, wenn die Maus auf den tatsächlichen Text geklickt wurde, der zu einem Element gehört. Wenn Sie also auf dieselbe Zeile wie ein Element geklickt haben, aber in eine Spalte, für die es keinen Text enthält, wird null zurückgegeben.

Eine Abhilfe für dieses ist einfach 0 passieren in als x-Parameter:

private void listView1_MouseUp(object sender, MouseEventArgs e) 
{ 
    ListViewItem item = listView1.GetItemAt(0, e.Y); 
    if (item == null) 
    { 
     MessageBox.Show("Null"); 
    } 
    else 
    { 
     MessageBox.Show(item.Text); 
    } 
} 

kann ich bestätigen, dass das funktioniert gut - es das Element zurückgibt, die auch in dieser Zeile lebt, wenn nur die erste Spalte Text darin.

1
private int getSelectedSubItemIndex(ListView listView) 
{ 
    if (listView.SelectedItems.Count == 1) 
    { 
     int x = 0; 
     ListViewItem item = listView.SelectedItems[0]; 
     Point pt = listView.PointToClient(Control.MousePosition); 
     for (int idx = 0; idx < item.SubItems.Count; ++idx) 
     { 
      x += listView.Columns[idx].Width; 
      if (pt.X < x) 
       return idx; 
     } 
    } 
    return -1; 
} 
Verwandte Themen