извлечение элемента из списка - PullRequest
0 голосов
/ 10 марта 2009

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

Я не уверен, как это сделать в .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, он выделяется синим цветом, поэтому невозможно просмотреть то, что выбрано. Я пытаюсь убрать эту синюю подсветку.

Есть мысли?

Ответы [ 2 ]

1 голос
/ 12 апреля 2012
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;
}
1 голос
/ 10 марта 2009

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

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

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

Обходной путь для этого - просто передать 0 в качестве параметра x:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...