Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.58/19: Рейтинг темы: голосов - 19, средняя оценка - 4.58
5 / 18 / 6
Регистрация: 15.10.2017
Сообщений: 161

Как разобраться с кареткой без циклов

20.08.2019, 17:42. Показов 4265. Ответов 34

Студворк — интернет-сервис помощи студентам
Пишу программу которая умеет считать строки, а точнее нумеровать их.
Идея такая сделал два текстбокса. Первый отвечает за нумерацию второй за текст.
Этот код работает очень медленно если его повесить на событие текстбокса
C#
1
2
3
4
countN = textBoxLesson.Text.Count(x => x == '\n');
                textBoxNumbers.Clear();
                for (int i = 1; i <= countN + 1; i++)
                    textBoxNumbers.AppendText(Convert.ToString(i) + "." + Environment.NewLine);
Придумал еще один вариант работает очень быстро 1 миллион строк вкинул за 1,5 секунды что меня очень порадовало. Ну работает он криво и что-то с кареткой!!!
Как бы его исправить без циклов и прочего и что-бы так сказать не нарушить его молниносную скорость!)) Спасибо огромное!
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;
 
namespace Terareader
{
    public partial class mainForm : Form
    {
        private string countLines;
        public mainForm()
        {
            InitializeComponent();
            linesCheck();
            getLinesCount();
        }
 
        private void getLinesCount()
        {
            using (StreamReader sr = new StreamReader(Directory.GetCurrentDirectory() + @"\nums.txt"))
            {
                countLines = string.Join("\n", sr.ReadToEnd().Split('\n'));
            }
        }
 
        private void linesCheck()
        {
            try
            {
                if (!File.Exists(Directory.GetCurrentDirectory() + @"\nums.txt"))
                {
                    List<string> l = new List<string>(); 
                        for (int i = 1; i <= 1000000; i++) // MAX LINES IN PROJECT
                            l.Add(Convert.ToString(i + Environment.NewLine));
                    string query = string.Join("\n", l);
                    File.WriteAllText(Directory.GetCurrentDirectory() + @"\nums.txt", query);
                    MessageBox.Show("Successful!");
                }
            }
            catch
            {
                MessageBox.Show("Bad!");
            }
        }
 
        private void TextBoxMainReader_TextChanged(object sender, EventArgs e)
        {
            /*Нужно отработать с кареткой*/
            this.textBoxNumbers.Text = countLines
            .Substring(0, (textBoxMainReader.Text.Count(x => x == '\n')));
        }
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.08.2019, 17:42
Ответы с готовыми решениями:

Подскажите как это сделать без циклов
Задача 6* Ввести два целых числа a и b. Если a делится на b или b делится на a вывести 1, иначе – любое другое число. Условные операторы...

Как удалить в тексте последние '.' без использования циклов
Например есть текст &quot;...bla bla bal...&quot; или &quot;...bla bla bal&quot; как удалить только последние троеточие, не хочется городить блоки if...else,...

Как быстро копировать память без всяких циклов
в CopyMemory цикл есть.

34
 Аватар для V_Monomax
1406 / 1260 / 20
Регистрация: 09.08.2011
Сообщений: 2,319
Записей в блоге: 1
23.08.2019, 09:39
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Terabiterr Посмотреть сообщение
Покажите два текстбокса В которые можно было бы закинуть 1м строк и как вы говорите оно пронумерует за 1мс. Не верю!)
Читай внимательно что я написал ранее...
Цитата Сообщение от Terabiterr Посмотреть сообщение
Я не верю вам что ваш код работает с 1000000 строками быстрее чем мой,
Это ваше желание/не желание
Цитата Сообщение от Terabiterr Посмотреть сообщение
Ну со скоростью работы пока проблема не решена.
Как хотите, я только пытался вам помочь...
1
5 / 18 / 6
Регистрация: 15.10.2017
Сообщений: 161
23.08.2019, 10:40  [ТС]
Цитата Сообщение от V_Monomax Посмотреть сообщение
не верю, у меня при прогонке такой код исполняется менее чем за 1 мс! Проверяйте что у вас не так!
Вот ваше сообщение, все верно, все прочитано правильно
Цитата Сообщение от V_Monomax Посмотреть сообщение
Это ваше желание/не желание
Это не желание а ваши слова которые не доказаны вами же.
Цитата Сообщение от V_Monomax Посмотреть сообщение
Как хотите, я только пытался вам помочь...
Спасибо всем благодарен кто помогает в этой теме, на то она и создана. Кнопку спасибо нажал.

Добавлено через 6 минут
Тема актуальная у кого есть идея просьба отписаться буду очень благодарен!
Новый исходник уже с новыми идеями.
Пока все работает так как надо но проблема с вставками не решена. Так же здесь я решил проблему со скролами. Теперь при добавление текста в textboxReader => texboxNumber нумерует строку и скролится синхронно вместе с текстбоксам 2.

На данный момент не решена проблема при вставки текста быстро пронумеровать строки. А так же при его удаление
Полный исходный код текстового редактора без отдельного класса который отвечает за синхронный скроллинг
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
using System;
using System.IO;
using System.Linq;
using System.Windows.Forms;
namespace Terareader
{
    public partial class mainForm : Form
    {
        private bool flagLines; 
        public mainForm()
        {
            InitializeComponent();
            this.textBoxNumbers.Text = (this.textBoxMainReader.Lines.Length + 1).ToString() + Environment.NewLine;
            SyncTextBox scrol = new SyncTextBox();
            scrol.Buddy = this.textBoxNumbers; // Synchronous scrolling
            ContextMenu contMenu = new ContextMenu();
            this.textBoxMainReader.ContextMenu = contMenu; // Disable contextmenu dafault
            this.flagLines = false; 
        }
        private void NewToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.textBoxMainReader.Clear();
        }
 
        private void AuthorToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Dombrovsky.I.V");
        }
 
        private void VersionToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("1.0 [BETA]");
        }
 
        private void ExitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string message = "Save?";
            string title = "Close Window";
            MessageBoxButtons buttons = MessageBoxButtons.YesNo;
            DialogResult result = MessageBox.Show(message, title, buttons);
            if (result == DialogResult.Yes)
            {
                //Save this file
                SaveToolStripMenuItem_Click(this, e);
                this.Close();
            }
            else
            {
                this.Close();
            };
        }
 
        private void SaveToolStripMenuItem_Click(object sender, EventArgs e)
        {
            SaveFileDialog dialog = new SaveFileDialog();
            if (dialog.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    using (StreamWriter sw = new StreamWriter(dialog.FileName, false, System.Text.Encoding.Default))
                    {
                        sw.WriteLine(this.textBoxMainReader.Text);
                    }
                    MessageBox.Show("Successful!");
                }
                catch
                {
                    MessageBox.Show("Bad!");
                }
            }
        }
 
        private void MainForm_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.N && e.Control) // NEW
            {
                this.textBoxMainReader.Clear();
            }
            if (e.KeyCode == Keys.O && e.Control) // OPEN
            {
                OpenToolStripMenuItem_Click(null, e);
            }
            if (e.KeyCode == Keys.S && e.Control) // SAVE
            {
                SaveToolStripMenuItem_Click(null, e);
            }
        }
 
        private void OpenToolStripMenuItem_Click(object sender, EventArgs e) // Read file strings
        {
            OpenFileDialog dialog = new OpenFileDialog();
            if (dialog.ShowDialog() == DialogResult.OK)
            {
                using (StreamReader sr = new StreamReader(dialog.FileName))
                {
                    this.textBoxMainReader.Text = sr.ReadToEnd();
                }
            }
        }
 
        private void TextBoxMainReader_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) // Enter
            {
                if (this.textBoxMainReader.Lines.Length != 0)
                    this.textBoxNumbers.AppendText((this.textBoxMainReader.Lines.Length + 1).ToString() + Environment.NewLine);
                else
                    this.textBoxNumbers.AppendText((this.textBoxMainReader.Lines.Length + 2).ToString() + Environment.NewLine);
            }
            if (e.KeyCode == Keys.Back) // Back
            {
                int index = this.textBoxMainReader.GetLineFromCharIndex(this.textBoxMainReader.SelectionStart);
                try
                {
                    if (this.textBoxMainReader.Lines[index].Length == 0)
                    {
                        textBoxNumbers.Text = textBoxNumbers.Text.Remove(textBoxNumbers.Text.LastIndexOf(Environment.NewLine));
                        textBoxNumbers.Text = textBoxNumbers.Text.Remove(textBoxNumbers.Text.LastIndexOf(Environment.NewLine));
                        textBoxNumbers.AppendText("\r\n");
                    }
                }
                catch { Console.Beep(); }
            }
        }
 
        private void TextBoxMainReader_Click(object sender, EventArgs e)
        {
            ((TextBox)sender).SelectionLength = 0;
        }
 
        private void TextBoxMainReader_MouseLeave(object sender, EventArgs e)
        {
            ((TextBox)sender).SelectionLength = 0;
        }
 
        private void TextBoxMainReader_DoubleClick(object sender, EventArgs e)
        {
            ((TextBox)sender).SelectionLength = 0;
        }
    }
}
0
 Аватар для V_Monomax
1406 / 1260 / 20
Регистрация: 09.08.2011
Сообщений: 2,319
Записей в блоге: 1
23.08.2019, 10:45
Цитата Сообщение от Terabiterr Посмотреть сообщение
Вот ваше сообщение, все верно, все прочитано правильно
не до конца:
Цитата Сообщение от V_Monomax Посмотреть сообщение
при этом отключите загрузку файла!
Т.е. уберите все ваши обработчики, создайте простой контрол и загоните в него данные, создайте тест и прогоните его...
1
5 / 18 / 6
Регистрация: 15.10.2017
Сообщений: 161
23.08.2019, 10:54  [ТС]
Цитата Сообщение от V_Monomax Посмотреть сообщение
Т.е. уберите все ваши обработчики, создайте простой контрол и загоните в него данные, создайте тест и прогоните его...
Ок когда я сделаю это я вам покажу исходный код и таймер.

Добавлено через 3 минуты
V_Monomax, Есть к вам вопрос как сделать правильно на общее событие вешать ваш код или на событие конкретно именно вставки текста.
Если второе тогда как сделать событие на вставку текста я не знаю. Это нужно делать событие на ctrl + V на "вставить" в контекстном меню и на открыть в контекстном меню а так же на горячую клавишу которая отвечает за открыть.
0
 Аватар для V_Monomax
1406 / 1260 / 20
Регистрация: 09.08.2011
Сообщений: 2,319
Записей в блоге: 1
23.08.2019, 11:24
Цитата Сообщение от Terabiterr Посмотреть сообщение
Есть к вам вопрос как сделать правильно на общее событие вешать ваш код или на событие конкретно именно вставки текста.
сейчас о каком коде речь? Если который нумерует, просто строки, то там никакого обработчика не надо, там вы тупо вносите данные в контрол....
А если вы речь ведете о том что вы хотите печатая текст нумеровать строки, то ту погодите, давайте разберемся в том что один цикл на миллионы итераций с простеньким кодом не расходует особо времени.
А вот навешивание такого кода на часто исполняемое событие - абсолютное зло.
Важно что-бы вы поняли, выбранный вами путь, очень плохой путь.
В вашем случае надо выполнять условие:
Берем изначальное значение, строк, берем текущее, если колличество не изменилосьЮ ничего не делаем, иначе исполняем нумерацию, путем добавления строки, в конец (если дельта увеличилась, иначе удаляем последнюю строку...).
1
5 / 18 / 6
Регистрация: 15.10.2017
Сообщений: 161
23.08.2019, 15:46  [ТС]
Цитата Сообщение от V_Monomax Посмотреть сообщение
А если вы речь ведете о том что вы хотите печатая текст нумеровать строки, то ту погодите, давайте разберемся в том что один цикл на миллионы итераций с простеньким кодом не расходует особо времени.
А вот навешивание такого кода на часто исполняемое событие - абсолютное зло.
Важно что-бы вы поняли, выбранный вами путь, очень плохой путь.
В вашем случае надо выполнять условие:
Берем изначальное значение, строк, берем текущее, если колличество не изменилосьЮ ничего не делаем, иначе исполняем нумерацию, путем добавления строки, в конец (если дельта увеличилась, иначе удаляем последнюю строку...).
Это я решил таким путем, осталось только решить проблему со вставкой!
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
private void TextBoxMainReader_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) // Enter
            {
                if (this.textBoxMainReader.Lines.Length != 0)
                    this.textBoxNumbers.AppendText((this.textBoxMainReader.Lines.Length + 1).ToString() + Environment.NewLine);
                else
                    this.textBoxNumbers.AppendText((this.textBoxMainReader.Lines.Length + 2).ToString() + Environment.NewLine);
            }
            if (e.KeyCode == Keys.Back) // Back
            {
                int index = this.textBoxMainReader.GetLineFromCharIndex(this.textBoxMainReader.SelectionStart);
                try
                {
                    if (this.textBoxMainReader.Lines[index].Length == 0)
                    {
                        textBoxNumbers.Text = textBoxNumbers.Text.Remove(textBoxNumbers.Text.LastIndexOf(Environment.NewLine));
                        textBoxNumbers.Text = textBoxNumbers.Text.Remove(textBoxNumbers.Text.LastIndexOf(Environment.NewLine));
                        textBoxNumbers.AppendText("\r\n");
                    }
                }
                catch { Console.Beep(); }
            }
        }
0
5 / 18 / 6
Регистрация: 15.10.2017
Сообщений: 161
25.08.2019, 20:40  [ТС]
V_Monomax, Даже не стал вам писать ни какого таймера стало все ясно при запуске вашего кода. Код работает крайне медленно я сидел ждал 1м строк примерно секунд 15 Когда тот же notepad вставляет нумерацию вместе с строкой на 1м за щелчок пальца!

Запускаю ваш код функцией которую при старте программы запускает конструктор и функция отрабатывает.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            startNubers(); 
        }
 
        private void startNubers()
        {
            for (var i = 0; i < 1000000; i++)
            {
                if (i > 0)
                {
                    richTextBox2.Text += $"{i + 1}{Environment.NewLine}";
                }
                else
                {
                    richTextBox2.Text += $"{i + 1}";
                };
            }
        }
    }
}
Стало уже просто интересно ну как они решили эту задачу!))))) Реально в notepad++ закидует строку на не сколько лямов считает ее и прочее за щелчок пальца))

Добавлено через 7 минут
Я согласен ваш код не много быстрее ну это и так ясно, моего на первый взгляд! Но на (практике) в программе я лично разницы не заметил. А если она и есть то там миллисекунды.
В этой задаче нужно что-то другое. Уже просто ради интереса как решать подобные задачи не знаю!)))
0
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
25.08.2019, 22:38
тут можно попробовать убрать иф-элс, много не выгадаешь, но все же, и самое главное убрать конкатенации строк, вот где злое злище
1
5 / 18 / 6
Регистрация: 15.10.2017
Сообщений: 161
26.08.2019, 10:53  [ТС]
Цитата Сообщение от Diamante Посмотреть сообщение
конкатенации строк
Да согласен эти штуки очень много отбирают ресурсов. Интересно как бы придумать иначе.
0
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
26.08.2019, 23:46
Лучший ответ Сообщение было отмечено Terabiterr как решение

Решение

допустим, что известно кол-во строк, тогда
C#
1
string.Join("\r\n",Enumerable.Range(1,count));
1
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
31.08.2019, 12:37
Лучший ответ Сообщение было отмечено Terabiterr как решение

Решение

Во первых StringBuilder вместо простой конкатенации строк, во вторых использовать единоразово присваивание textBox.Text = stringBuilder.ToString()
1
 Аватар для art_artemios
35 / 23 / 7
Регистрация: 23.12.2018
Сообщений: 101
03.09.2019, 22:38
Terabiterr, дико извиняюсь, но прошу пояснить задачу, т.к. не врубаюсь:
Тебе нужен один текстбокс на ввод текста, а другой - на вывод результата с уже пронумерованными строками?
0
5 / 18 / 6
Регистрация: 15.10.2017
Сообщений: 161
09.09.2019, 11:00  [ТС]
V_Monomax,
Я так дart_artemios, Ты когда в visual studio пишешь код , ты не когда не замечал что слева нумеруются строки?
Вот это задание именно про это.Причем это должно работать как можно быстрее!)
0
.NET
133 / 91 / 44
Регистрация: 17.08.2015
Сообщений: 296
09.09.2019, 11:41
Лучший ответ Сообщение было отмечено Terabiterr как решение

Решение

Цитата Сообщение от Terabiterr Посмотреть сообщение
слева нумеруются строки
Это отдельный компонент.
Добавляешь Label на форму и располагаешь рядом с textbox'ом.


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private void updateLabel()
        {
            Point pos = new Point(0, 0);
            int firstIndex = textBox1.GetCharIndexFromPosition(pos);
            int firstLine = textBox1.GetLineFromCharIndex(firstIndex);
 
            pos.X = ClientRectangle.Width;
            pos.Y = ClientRectangle.Height;
            int lastIndex = textBox1.GetCharIndexFromPosition(pos);
            int lastLine = textBox1.GetLineFromCharIndex(lastIndex);
 
            pos = textBox1.GetPositionFromCharIndex(lastIndex);
 
 
            numberLabel.Text = "";
            for (int i = firstLine; i <= lastLine + 1; i++)
            {
                numberLabel.Text += i + 1 + "\n";
            }
 
        }
C#
1
2
3
4
private void textBox1_KeyUp(object sender, KeyEventArgs e)
        {
            updateLabel();
        }
Добавлено через 5 минут
А лучше сделать обработку через прокрутку колесика
2
5 / 18 / 6
Регистрация: 15.10.2017
Сообщений: 161
09.09.2019, 12:00  [ТС]
Цитата Сообщение от M1ke423 Посмотреть сообщение
Это отдельный компонент.
Добавляешь Label на форму и располагаешь рядом с textbox'ом.
Спасибо я попробую вашу идею.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.09.2019, 12:00

Как управлять кареткой в файловом выводе
Всем привет,в общем такой вопрос: struct Table //сама структура { public string surname; public string...

Как узнать сколько дней в месяце, по дате без циклов?
Ктонибудь знает как узнать сколько дней в месяце, по дате без циклов. Например 10.2004 сколько в нём дней или какое последнее число.

Как развернуть многоуровневый список через рекурсию без циклов?
есть функция, которая получает список произвольной вложенности, после должна линеаризировать его и вернуть результат. у меня получилось...

Как узнать, владеет ли активное окно кареткой (и можно ли вообще) ?
Суть в том, что нужно по сочетанию клавиш отобразить менюшку рядом с курсором ввода, если в этом окне вообще есть какой-нибудь ввод. Я...

Как скопировать массив в вектор одной строкой без использования циклов и алгоритмов STL?
Уважаемые формучане, не подскажете, как скопировать массив в вектор одной строкой без использования циклов и алгоритмов STL?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ начало и оглавление - Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование. . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru