2009-03-10 3 views
0

Я использую ListView.GetItemAt(x,y) для извлечения элемента из ListView, но я не состояния получить деталь, когда я установил опцию FullRowSelect к false.извлечение элемента в ListView

Я не уверен, как это сделать в .NET 1.1. У кого-нибудь есть указатели?

Вот фрагмент кода:

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; 
} 

Этот метод должен показать мне, какая ячейка была нажата. Tt работает, но если я изменю fullrowselect на false, он возвращает значение null.

Я даже попробовал getitemat(0,e.y), но это не сработало.

всякий раз, когда я выбираю элемент в ListView, он выделяется синим цветом, поэтому невозможно просмотреть выбранное. Я пытаюсь удалить эту синюю подсветку.

Любые мысли?

+0

hi do u узнал что-нибудь – 2009-03-10 07:01:51

ответ

1

Можете ли вы подробно рассказать о том, что вы пытаетесь сделать?

Установлен ли ViewStyle в ListView в детали? Поскольку вы указываете, что параметр FullRowSelect равен false, я предполагаю, что это так.

GetItemAt (x, y) будет работать, только если мышь была нажата на фактический текст, принадлежащий элементу. Поэтому, если вы нажали на ту же строку, что и элемент, но в столбце, в котором у него нет текста, он вернет значение null.

Обойти это просто передать 0 в качестве параметра х:

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); 
    } 
} 

Я могу подтвердить, что это работает отлично - возвращает элемент, который живет на этой строке, даже если только первый столбец имеет текст в нем.

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; 
} 
Смежные вопросы