Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > ListView. показать редактор item'a


Автор: _hunter 13.3.2008, 20:07
Добрый день.

Пытаюсь сделать custom-редактор для item'ов/subItem'ов. Для этого в обработчике MouseDown пытаюсь показать TextBox:
Код

        private void ListView_MouseDown (object sender, System.Windows.Forms.MouseEventArgs e)
        {
            ListViewHitTestInfo hti = HitTest(e.X, e.Y);

            ListViewItem listViewItem = hti.Item;
            if (listViewItem == null)
                listViewItem = GetItemAt(e.X, e.Y);
            ListViewItem.ListViewSubItem listViewSubItem = hti.SubItem;

            if (listViewSubItem != null)
            {
                _fieldsEditor.Bounds = listViewSubItem.Bounds;//так же пробовал RectangleToScreen(listViewSubItem.Bounds)
                _fieldsEditor.BringToFront();
                _fieldsEditor.Show();
            }

        }

_fieldsEditor.Show() вызывется, но TextBox не появляется :(

Что я делаю не так/как это исправить?

С уважением...

Автор: vponomarov 14.3.2008, 10:57
попробуй писать что-то вроде такого:
Код

 if (listViewSubItem != null)
            {
                TextBox fieldsEditor=new TextBox();
                _fieldsEditor.Bounds = listViewSubItem.Bounds;//так же пробовал RectangleToScreen(listViewSubItem.Bounds)
                ListView1.Controls.Add(fieldsEditor);
                //_fieldsEditor.BringToFront();
                //_fieldsEditor.Show();
            }


если не хочешь, чтобы каждый раз создавался TextBox, то после окончания редактирования нужно его убирать из контролов листБокса

Автор: _hunter 14.3.2008, 11:47
начал появляться, но есть одна проблема: этот TextBox почему-то выше (его height больше) чем высота строки ListView'a.
причем это происходит уже в момент _fieldsEditor.Bounds = listViewSubItem.Bounds: после присваивания
listViewSubItem.Bounds.Height == 14, а _fieldsEditor.Bounds.Height == 20...

Автор: vponomarov 14.3.2008, 12:23
_hunter, высота текстБоха зависит от размера шрифта и в зависимости от него(размера) не может быть меньше определенной величины.
попробуй поиграться с этим параметром

Автор: _hunter 14.3.2008, 13:54
и еще вопрос: я хочу чтобы сразу после показа этого TextBox'а в него можно было вводить текст. для этого пишу:
bool focused = _fieldsEditor.Focus();
focused == true, но курсор для ввода текста не появляется...

Автор: _hunter 14.3.2008, 14:22
и насчет шрифта: я есть какой-то другой способ уменьшить высоту (или это одтельной темой лучше спросить) -- приемлемая высота получается только при 5-м размере шрифта, что очень мало...

Автор: vponomarov 14.3.2008, 14:43
странно. я попробовал такой код:
Код

TextBox __txt = new TextBox();
            __txt.Name = "aaa" + DateTime.Now.Ticks.ToString();
            __txt.Top = userList.Controls.Count > 0 ? userList.Controls[userList.Controls.Count - 1].Top + 25 : 0;
            userList.Controls.Add(__txt);
            //this.ActiveControl = __txt;
            __txt.Focus();
            return;

работают оба варианта: и Focus() и ActiveControl.

Добавлено через 4 минуты и 44 секунды
а на счет высоты: сделай свойство Multiline=true и сможешь выставлять любую высоту smile 

Автор: _hunter 14.3.2008, 15:29
ничего не понимаю... делаю так:
Код

        private void ListView_MouseDown (object sender, System.Windows.Forms.MouseEventArgs e)
        {
            ListViewHitTestInfo hti = HitTest(e.X, e.Y);

            ListViewItem listViewItem = hti.Item;
            if (listViewItem == null)
                listViewItem = GetItemAt(e.X, e.Y);
            ListViewItem.ListViewSubItem listViewSubItem = hti.SubItem;

            if (listViewSubItem != null)
            {
                if (_fieldsEditor == null)
                {
                    _fieldsEditor = new TextBox();
                    Controls.Add(_fieldsEditor);

                    //Font currentFont = _fieldsEditor.Font;
                    //_fieldsEditor.Font = new Font(currentFont.FontFamily, 5, currentFont.Style);
                }

                _fieldsEditor.Bounds = listViewSubItem.Bounds;
                bool focus = _fieldsEditor.Focus();
            }
        }

и нет фокуса...

Автор: CYBERDREAM 14.3.2008, 15:38
напиши просто:
Код

_fieldsEditor.Focus();


Добавлено через 3 минуты и 20 секунд
прошу прощения, не верно smile

Добавлено через 6 минут и 29 секунд
кажется знаю в чем проблема. Повесь обработчки не на MouseDown, а на MouseUp. В похожем случае это решило проблему с фокусом  smile 

Автор: vponomarov 14.3.2008, 16:21
Цитата

Повесь обработчки не на MouseDown, а на MouseUp

да, может быть и в этом проблема. я бы вообще повесил на MouseClick или даже MouseDoubleClick smile 

Автор: _hunter 14.3.2008, 16:33
попробовал и MouseUp и MouseClick -- курсор появляться не хочет и клавиши нажимаются в ListView'е :(

Автор: vponomarov 14.3.2008, 17:50
вот этот код точно работает, только что не поленился проверил!
Код

private void userList_MouseClick(object sender, MouseEventArgs e)
        {
            ListViewHitTestInfo hti = userList.HitTest(e.X, e.Y);

            ListViewItem listViewItem = hti.Item;
            if (listViewItem != null)
            {
                TextBox _fieldsEditor = new TextBox();
                _fieldsEditor = new TextBox();
                userList.Controls.Add(_fieldsEditor);

                _fieldsEditor.Bounds = listViewItem.Bounds;
                bool focus = _fieldsEditor.Focus();
            }
        }


если нужно чтобы редактировались только субИтемы - замени hti.Item на hti.SubItem

Автор: CYBERDREAM 14.3.2008, 17:56
2 vponomarov рыли мы в верном направлении. Просто обработчик был подписан на MouseDown ))

Автор: vponomarov 14.3.2008, 18:10
2 CYBERDREAM возможно и в этом была проблема
но там изначально в коде много чего неправильного на мой взгляд было...
ну да главное, что проблема решена smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)