Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Выделить весь текст в TextBox при перемещении в него. / 25 сообщений из 30, страница 1 из 2
16.01.2015, 13:57
    #38856145
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделить весь текст в TextBox при перемещении в него.
Ну т.е. код такой:

Код: vbnet
1.
2.
3.
4.
5.
  Private Sub TextBox1_GotFocus(sender As Object, e As EventArgs) Handles TextBox1.GotFocus
    Debug.Print("TextBox1_GotFocus")
    Me.TextBox1.SelectionStart = 0
    Me.TextBox1.SelectionLength = Strings.Len(Me.TextBox1.Text)
  End Sub



По TAB работает
А если ткнуть мышкой -ни фига. Ощущение что срабатывает(GotFocus понятно ловится), но потом происходит что-то еще и выделение всего текста снимается.
В VB6 аналогичный код работал и для мышки тоже.
Как полечить?
...
Рейтинг: 0 / 0
16.01.2015, 14:20
    #38856172
Belavik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделить весь текст в TextBox при перемещении в него.
А зачем такое делать?
...
Рейтинг: 0 / 0
16.01.2015, 14:35
    #38856186
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделить весь текст в TextBox при перемещении в него.
Belavik,

Да сделано у меня так просто. Textbox -ReadOnly.
Тыкнулся юзер туда - ему сразу все выделилось - удобно.
Типа намек на то что надо скопировать текст целиком (ID-компа нужный для генерации лицензии).
В VB6 код выше автоматом работал и для мышки тоже.

Ну это стандартное поведение ComboBox которое кстати бесит.

Причем я даже через API не знаю как это сделать.
Edit Control Styles -нет там ничего.

Понятно можно через комбинацию событий и булевую переменную сыграть, но я так не люблю делать.
Нашел вот, почитал. Бред какой-то.
Automatically select all text on focus in WinForms TextBox

Фигня конечно.
...
Рейтинг: 0 / 0
16.01.2015, 14:37
    #38856190
Belavik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделить весь текст в TextBox при перемещении в него.
Дмитрий77Belavik,

Да сделано у меня так просто. Textbox -ReadOnly.
Тыкнулся юзер туда - ему сразу все выделилось - удобно.
Типа намек на то что надо скопировать текст целиком (ID-компа нужный для генерации лицензии).
В VB6 код выше автоматом работал и для мышки тоже.

Ну это стандартное поведение ComboBox которое кстати бесит.

Причем я даже через API не знаю как это сделать.
Edit Control Styles -нет там ничего.

Понятно можно через комбинацию событий и булевую переменную сыграть, но я так не люблю делать.
Нашел вот, почитал. Бред какой-то.
Automatically select all text on focus in WinForms TextBox

Фигня конечно.
Все, сообразил. Я подумал, что ты хочешь выделить текст в Textbox-е при перемещении в него текста. Вот и мозг чуть не сломал.
...
Рейтинг: 0 / 0
16.01.2015, 14:46
    #38856197
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделить весь текст в TextBox при перемещении в него.
Belavik,

короче неохота мозги ломать, есть такой спасительный прием как минимальный тик таймера в 1 миллисекунду:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  Private Sub TextBox1_GotFocus(sender As Object, e As EventArgs) Handles TextBox1.GotFocus
    'TimerSelect.Interval = 1
    TimerSelect.Enabled = True
  End Sub

  Private Sub TimerSelect_Tick(sender As Object, e As EventArgs) Handles TimerSelect.Tick
    TimerSelect.Enabled = False
    Me.TextBox1.SelectionStart = 0
    Me.TextBox1.SelectionLength = Strings.Len(Me.TextBox1.Text)
  End Sub
...
Рейтинг: 0 / 0
16.01.2015, 15:47
    #38856309
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделить весь текст в TextBox при перемещении в него.
Дмитрий77,

у текстбокса вроде должно быть событие OnEnter, таймер не нужен
...
Рейтинг: 0 / 0
16.01.2015, 16:04
    #38856344
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделить весь текст в TextBox при перемещении в него.
Arm79,

там в WndProc именно на сообщение входа в TextBox есть отдельный кейс

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
    public class TextBoxEx : TextBox
    {
        protected override void OnGotFocus(EventArgs e)
        {
            SelectAll();
            base.OnGotFocus(e);
        }

        protected override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {
                case 513:
                    base.WndProc(ref m);
                    SelectAll();
                    break;
                default:
                    base.WndProc(ref m);
                    break;
            }
        }
    }


вот рабочий вариант, при получении фокуса с клавы и мышки текст в боксе выделяется весь.
...
Рейтинг: 0 / 0
16.01.2015, 16:09
    #38856348
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделить весь текст в TextBox при перемещении в него.
Arm79,

_Enter бесполезен, тем более он генерируется до _GotFocus
Скорее всего выделение снимается по какому нибудь _(Mouse)Click, которое происходит сразу после _GotFocus
но ИМХО чем извращаться с этим - проще таймер.

Но, могу добавить что то чего хочу - это не родное поведение Common Controls, так что в данном случае к .Net без претензий.
В VB6 работает видимо в силу его (другой) модели последовательности событий -типа подфортило и совпало с моими желаниями.
...
Рейтинг: 0 / 0
16.01.2015, 16:14
    #38856354
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделить весь текст в TextBox при перемещении в него.
Roman Mejtes
Код: c#
1.
2.
3.
4.
5.
6.
...
                case 513:
                    base.WndProc(ref m);
                    SelectAll();
                    break;
...


вот рабочий вариант, при получении фокуса с клавы и мышки текст в боксе выделяется весь.

Сабклассить?
А 513 это какая константа?
...
Рейтинг: 0 / 0
16.01.2015, 16:14
    #38856355
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделить весь текст в TextBox при перемещении в него.
Дмитрий77,

городить такое через таймер, это говнокод
...
Рейтинг: 0 / 0
16.01.2015, 16:15
    #38856359
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделить весь текст в TextBox при перемещении в него.
Roman Mejtes,

в гугле забаннили?
http://wiki.winehq.org/List_Of_Windows_Messages
...
Рейтинг: 0 / 0
16.01.2015, 16:21
    #38856367
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделить весь текст в TextBox при перемещении в него.
Roman Mejtesгородить такое через таймер, это говнокод
Согласен. Но в меньшей степени, чем здесь напридумывали:
Automatically select all text on focus in WinForms TextBox
В смысле гавнокода меньше.

Ну знаешь, тут у людей другие понятия про что есть "гавнокод", я это уже заметил.

>в гугле забаннили?
Да не, просто думал ты быстрее ответишь. Счас глянем.
...
Рейтинг: 0 / 0
16.01.2015, 16:24
    #38856373
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделить весь текст в TextBox при перемещении в него.
Дмитрий77,

вообще я на WF не программирую уже очень давно и знаю её плохо. Но чтоб разобраться, как это сделать, я просто открыл исходный код TextBox и нашел причину описанного тобой поведения. Это тебе на будущее, куда смотреть в след. раз :)
...
Рейтинг: 0 / 0
16.01.2015, 16:34
    #38856380
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделить весь текст в TextBox при перемещении в него.
Roman Mejtes,

513 - WM_LBUTTONDOWN
Это и через .Net можно сделать:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
 Private Sub TextBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles TextBox1.MouseDown
    If e.Button = Windows.Forms.MouseButtons.Left Then
      Me.TextBox1.SelectionStart = 0
      Me.TextBox1.SelectionLength = Strings.Len(Me.TextBox1.Text)
    End If
  End Sub
 



Только это плохое решение.
У тебя весь текст будет выделяться при КАЖДОМ щелчке мыши (а не только при входе в контрол), а у меня такой цели не стоит.
...
Рейтинг: 0 / 0
16.01.2015, 16:41
    #38856387
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделить весь текст в TextBox при перемещении в него.
Дмитрий77,

проверяй наличие фокуса, если нет фокуса то выполни базовый и выдели всё
...
Рейтинг: 0 / 0
16.01.2015, 16:50
    #38856398
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделить весь текст в TextBox при перемещении в него.
Roman Mejtes,

мне думается что лучше гавнотаймер чем гавнопроверки в таком духе ,коих гавнопроверок приведено куча вариантов по той ссылке что я дважды процитировал.
...
Рейтинг: 0 / 0
16.01.2015, 16:55
    #38856406
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделить весь текст в TextBox при перемещении в него.
Дмитрий77,

ну если ты считаешь, что таймер лучше, чем условие, то удачи конечно
...
Рейтинг: 0 / 0
16.01.2015, 17:14
    #38856433
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделить весь текст в TextBox при перемещении в него.
Roman Mejtes,

Да не считаю я так. Просто условия там нормального не придумаешь.

Я нарочно проверил:
В VB6 генерируется последовательность событий:
Text1_MouseDown
Text1_GotFocus
-и за счет этого мой код работает без лишних извращений.

А в .Net генерируется последовательность событий:
TextBox1_Enter
TextBox1_GotFocus
TextBox1_MouseDown
-и за счет этого аналогичный код не работает.

И нужны извращения - по любому. Либо таймер, который эа свою миллисекунду перескочит через _MouseDown,
либо как ты говоришь условия, а я добавлю - извращенные условия.
И не важно, каким образом эти условия накладывать - через .Net-события или через сабклассинг окна,
что для этой минизадачи точно - ну никак не оправданное излишество, при всем моем уважении к API-технологиям.
...
Рейтинг: 0 / 0
26.01.2015, 23:33
    #38863768
wawawa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделить весь текст в TextBox при перемещении в него.
Если я правильно Вас понял
Код: vbnet
1.
2.
3.
 Private Sub TextBox2_Enter(sender As Object, e As EventArgs) Handles TextBox2.Enter, TextBox2.Click
        TextBox2.SelectAll()
    End Sub


Выделяет весь текст по табу и клику мыши.
...
Рейтинг: 0 / 0
27.01.2015, 13:58
    #38864228
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделить весь текст в TextBox при перемещении в него.
wawawaЕсли я правильно Вас понял
Код: vbnet
1.
2.
3.
 Private Sub TextBox2_Enter(sender As Object, e As EventArgs) Handles TextBox2.Enter, TextBox2.Click
        TextBox2.SelectAll()
    End Sub



Выделяет весь текст по табу и клику мыши.

Нееееет! Только таймером! Никаких простых решений, найн найн, ето охтунг и не по-нашему!
...
Рейтинг: 0 / 0
27.01.2015, 15:12
    #38864370
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделить весь текст в TextBox при перемещении в него.
wawawaВыделяет весь текст по ... и клику мыши.
Пробовал?
Пост выше читал?
А в .Net генерируется последовательность событий:
TextBox1_Enter
TextBox1_GotFocus
TextBox1_MouseDown
_Enter -да, твой код сработает, он выделит
но
_MouseDown - это выделение тут же снимет

Таймер нужен, чтоб "перепрыгнуть" через _MouseDown.
Гавнокод, да. Зато просто, ясно и работает.
...
Рейтинг: 0 / 0
27.01.2015, 15:21
    #38864395
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделить весь текст в TextBox при перемещении в него.
Дмитрий77wawawaВыделяет весь текст по ... и клику мыши.
Пробовал?
Пост выше читал?
А в .Net генерируется последовательность событий:
TextBox1_Enter
TextBox1_GotFocus
TextBox1_MouseDown
_Enter -да, твой код сработает, он выделит
но
_MouseDown - это выделение тут же снимет

Таймер нужен, чтоб "перепрыгнуть" через _MouseDown.
Гавнокод, да. Зато просто, ясно и работает.
А если по Enter выставить флаг, а по MouseDown посмотреть на него, и, если выставлен, делать SelectAll? Какой-нить AutoresetEvent...

PS Таймер становится мемом :-)
...
Рейтинг: 0 / 0
27.01.2015, 15:45
    #38864437
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделить весь текст в TextBox при перемещении в него.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
        private bool _flag = false;

        private void textBox2_Enter(object sender, EventArgs e)
        {
            textBox2.SelectAll();

            _flag = true;
        }

        private void textBox2_MouseDown(object sender, MouseEventArgs e)
        {
            if (_flag)
            {
                _flag = false;
                textBox2.SelectAll();
            }
        }
...
Рейтинг: 0 / 0
27.01.2015, 16:21
    #38864500
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделить весь текст в TextBox при перемещении в него.
Arm79
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
        private bool _flag = false;

        private void textBox2_Enter(object sender, EventArgs e)
        {
            textBox2.SelectAll();

            _flag = true;
        }

        private void textBox2_MouseDown(object sender, MouseEventArgs e)
        {
            if (_flag)
            {
                _flag = false;
                textBox2.SelectAll();
            }
        }



Вот второй вариант:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
        private readonly AutoResetEvent _flag2 = new AutoResetEvent(false);
        //private bool _flag = false;

        private void textBox2_Enter(object sender, EventArgs e)
        {
            textBox2.SelectAll();

            _flag2.Set();
            //_flag = true;
        }

        private void textBox2_MouseDown(object sender, MouseEventArgs e)
        {
            if (_flag2.WaitOne(0))
                textBox2.SelectAll();

            //if (_flag)
            //{
            //    _flag = false;
            //    textBox2.SelectAll();
            //}
        }



По хорошему нужно бы создать отдельный UserControl, в который запихать нужное поведение, и использовать его вместо TextBox
...
Рейтинг: 0 / 0
27.01.2015, 17:06
    #38864565
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделить весь текст в TextBox при перемещении в него.
Arm79, забей.
Я уже давно забил и забыл.

Arm79А если по Enter выставить флаг, а по MouseDown посмотреть на него, и, если выставлен, делать SelectAll?
А где гарантия что MouseDown вообще будет?
Ты пришел туда через Tab, флаг твой останется висеть в True.
Дальше ты ткнешь туда мышью и вместо штатного попадания курсором получишь опять выделение (когда это уже не нужно).
Напрягаем все свои знания по событиям .Net и(или) по API (сообщения окну) ?-> Городим новый флаг, чтобы это полечить? -> получаем уже не гавнотаймер а цепочку гавнокода, которая при таком подходе обязательно сгавнит в каком-нибудь частном случае. Таймер по крайне мере не гавнит.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Выделить весь текст в TextBox при перемещении в него. / 25 сообщений из 30, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]