Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
3 / 3 / 2
Регистрация: 07.03.2024
Сообщений: 154

Копирование строки при клике мышью

18.09.2025, 00:45. Показов 6069. Ответов 48
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я хотел бы, чтобы в программе, когда нажимаешь на строчку левой кнопкой мыши, она копировалась, выделяясь например красным цветом, и когда ты копируешь другую, то выделение переходит на неё и строчка копировалась. Пробовал с ListBox, строчки копировались, но нельзя было добавить текст, который не должен копироваться. Пришлось заменить на RichTextBox, чтобы можно было вписать и строчки копируемые и некопируемые, но строчки не копируются. Также, я хотел сделать, чтобы текст выезжал при нажатии на заголовок, как показано на первом скриншоте(Типа есть несколько блоков с заголовками, нажимая на которые можно показать и скрыть текст), но не смог. Меню боковое тоже хотел сделать как на первом скриншоте, но ничего не вышло. Форма моей программы на втором скриншоте. Помогите пожалуйста.
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
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 WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            button1.FlatStyle = FlatStyle.Flat;
            button1.FlatAppearance.BorderSize = 0;
            button2.FlatStyle = FlatStyle.Flat;
            button2.FlatAppearance.BorderSize = 0;
            button3.FlatStyle = FlatStyle.Flat;
            button3.FlatAppearance.BorderSize = 0;
            button4.FlatStyle = FlatStyle.Flat;
            button4.FlatAppearance.BorderSize = 0;
            button5.FlatStyle = FlatStyle.Flat;
            button5.FlatAppearance.BorderSize = 0;
            button6.FlatStyle = FlatStyle.Flat;
            button6.FlatAppearance.BorderSize = 0;
            button7.FlatStyle = FlatStyle.Flat;
            button7.FlatAppearance.BorderSize = 0;
            button8.FlatStyle = FlatStyle.Flat;
            button8.FlatAppearance.BorderSize = 0;
            button9.FlatStyle = FlatStyle.Flat;
            button9.FlatAppearance.BorderSize = 0;
            button10.FlatStyle = FlatStyle.Flat;
            button10.FlatAppearance.BorderSize = 0;
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            {
               // Заполнение RichTextBox
            AddCopyableLine(richTextBox1, "say Пожалуйста, положите Ваш паспорт на стол в открытом виде.");
                AddNonCopyableLine(richTextBox1, "Ждём отыгровок");
                AddCopyableLine(richTextBox1, "me изучил паспорт");
                AddCopyableLine(richTextBox1, "say Для получения медицинской карты необходимо пройти проверку на наличие алкоголя в крови, Вы согласны?");
                AddNonCopyableLine(richTextBox1, "В случае отказа:");
                AddCopyableLine(richTextBox1, "say Вам отказано в выдаче медицинской карты.");
                AddNonCopyableLine(richTextBox1, "В случае согласия:");
                AddCopyableLine(richTextBox1, "do В медицинской сумке лежит кейс с прибором \"Drager\".");
                AddCopyableLine(richTextBox1, "me достал кейс, открыл его и вытащил прибор \"Drager\"");
                AddCopyableLine(richTextBox1, "say При освидетельствовании будет использован прибор \"Drager\".");
                AddCopyableLine(richTextBox1, "do На устройстве можно заметить пломбу.");
                AddCopyableLine(richTextBox1, "todo Пломба на приборе присутствует*показав пломбу гражданину");
 
                // Добавьте остальные строки
 
                // Подписка на событие MouseClick
                richTextBox1.MouseClick += new MouseEventHandler(richTextBox1_MouseClick);
 
                // Делаем RichTextBox доступным только для чтения
                richTextBox1.ReadOnly = true;
            }
        }
        private void panel1_Paint(object sender, PaintEventArgs e)
        {
        }
        private void button1_Click(object sender, EventArgs e)
        {
        }
        private void button1_Click_1(object sender, EventArgs e)
        {
        }
        private void AddCopyableLine(RichTextBox rtb, string text)
        {
            rtb.AppendText(text + Environment.NewLine);
        }
 
        private void AddNonCopyableLine(RichTextBox rtb, string text)
        {
            rtb.AppendText(text + Environment.NewLine);
        
    }
 
        private void richTextBox1_MouseClick(object sender, MouseEventArgs e)
        {
            int index = richTextBox1.GetCharIndexFromPosition(e.Location);
            int lineNumber = richTextBox1.GetLineFromCharIndex(index);
            string line = richTextBox1.Lines[lineNumber];
 
            if (line.StartsWith("copy:"))
            {
                // Копируем текст без префикса "copy:"
                Clipboard.SetText(line.Substring(5));
            }
        }
    }
        }
Миниатюры
Копирование строки при клике мышью   Копирование строки при клике мышью  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.09.2025, 00:45
Ответы с готовыми решениями:

Динамическое создание PictureBox при клике мышью по форме
Здравствуйте! Сегодня решил спросить. А можно сделать так чтобы при каждом нажатии мыши на форме...

Выделение всего текста в TextBox при клике мышью
Друзья, подскажите пожалуйста как можно реализовать выделение ВСЕГО текста в TextBox'е посредством...

Изменение текста в TextBox элемента в GridView при клике мышью
Здравствуйте, господа. Есть у меня GridView, который заполняется из файла json. У элемента есть...

48
bite
 Аватар для I can
5010 / 4832 / 852
Регистрация: 13.04.2015
Сообщений: 10,109
19.09.2025, 12:06
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Перевод на русский нормально сделали или опять куча косяков есть?
Извините, не понял. О каком переводе речь?
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,770
Записей в блоге: 4
19.09.2025, 12:09
Цитата Сообщение от I can Посмотреть сообщение
Извините, не понял. О каком переводе речь?
Студии. Там косяков было много...
0
bite
 Аватар для I can
5010 / 4832 / 852
Регистрация: 13.04.2015
Сообщений: 10,109
19.09.2025, 12:10
Цитата Сообщение от Pirat Piratych Посмотреть сообщение
в боковом меню и раскроются разделы
Сразу не обратил внимание, а теперь уже "запал иссяк"
Я думаю, теперь сам допилишь по аналогии с правой стороной.

Не по теме:

Анекдот. Разговаривают двое:
- Не могу больше работать, запал иссяк.
- Кто запал?
- Иссяк.




Добавлено через 29 секунд

Не по теме:

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Студии.
А не, вроде норм.

2
3 / 3 / 2
Регистрация: 07.03.2024
Сообщений: 154
19.09.2025, 18:58  [ТС]
Сразу не обратил внимание, а теперь уже "запал иссяк"
Я думаю, теперь сам допилишь по аналогии с правой стороной.
Да. Допилю И туда можно вставить эти LabelLink, которые есть сейчас.

Добавлено через 5 часов 58 минут
Цитата Сообщение от I can Посмотреть сообщение
Я думаю, теперь сам допилишь по аналогии с правой стороной.
C#
1
2
3
4
5
6
7
8
9
10
private void addArrayToUserControl1(FlowLayoutPanel flp, string caption, struDataForUC[] arr)
{ flp.Controls.Add(new UC(caption, arr));
 
        addArrayToUC(flowLayoutPanel1, "Общее МЗ", new struDataForUC[]
           {
            new struDataForUC("Обязательные отыгровки", false),
             });
    }
}
}
Попытался сделать. Вышло черти что, т.е ничего.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3465 / 2785 / 576
Регистрация: 04.09.2018
Сообщений: 8,763
Записей в блоге: 3
19.09.2025, 21:05
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Перевод на русский нормально сделали или опять куча косяков есть?
А какие "косяки" были?
0
3 / 3 / 2
Регистрация: 07.03.2024
Сообщений: 154
20.09.2025, 09:24  [ТС]
Где я ошибся?
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,770
Записей в блоге: 4
22.09.2025, 08:30
Цитата Сообщение от wizard41 Посмотреть сообщение
А какие "косяки" были?
Где-то текст не влезал, слова какие-то замудрёные были. Такое ощущение что автомат переводил...
0
3 / 3 / 2
Регистрация: 07.03.2024
Сообщений: 154
22.09.2025, 08:42  [ТС]
Подскажите, как сделать, чтобы в боковом меню разделы раскрывались? Я перепробовал всё. Не помогает.
0
bite
 Аватар для I can
5010 / 4832 / 852
Регистрация: 13.04.2015
Сообщений: 10,109
22.09.2025, 19:45
Pirat Piratych, у тебя уже 4 уровня вложенности. Чтобы не городить огород в коде, тут так и просится использование json. Что-то типа
0
3 / 3 / 2
Регистрация: 07.03.2024
Сообщений: 154
22.09.2025, 21:28  [ТС]
Думал, без json обойдусь.
0
bite
 Аватар для I can
5010 / 4832 / 852
Регистрация: 13.04.2015
Сообщений: 10,109
22.09.2025, 21:40
Цитата Сообщение от Pirat Piratych Посмотреть сообщение
Думал, без json обойдусь.
Без это в коде ужас что будет.

Добавлено через 1 минуту
А еще лучше будет, если хранить данные в json-файле, а пункты меню чтобы добавлять прямо в программе.
0
3 / 3 / 2
Регистрация: 07.03.2024
Сообщений: 154
22.09.2025, 22:43  [ТС]
Попробую.
0
3 / 3 / 2
Регистрация: 07.03.2024
Сообщений: 154
24.09.2025, 09:46  [ТС]
Цитата Сообщение от I can Посмотреть сообщение
тут так и просится использование json.
Добавил. И теперь выходит туча ошибок.

Вот код:
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
142
143
144
145
146
147
148
149
150
151
152
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.IO;
using System.Windows.Forms;
 
 
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
 
            // Настраиваем форму и добавляем пользовательский контрол UsC
            var usControl = new UsC
            {
                Dock = DockStyle.Fill
            };
            this.Controls.Add(usControl);
 
            // Загружаем меню из JSON
            var menu = LoadMenuFromJson("myMenu.json");
 
            // Передаем данные в контрол для построения меню
            usControl.BuildMenu(menu);
        }
 
        List<MenuItem> LoadMenuFromJson(string filePath)
        {
            string json = File.ReadAllText(filePath);
            var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
            return JsonSerializer.Deserialize<List<MenuItem>>(json, options);
        }
    }
 
    // Класс модели меню
    public class MenuItem
    {
        public string Text { get; set; }
        public bool Copyable { get; set; } = false;
        public List<MenuItem> Data { get; set; } = null;
    }
 
    // Пользовательский контрол UsC
    public class UsC : UserControl
    {
        private FlowLayoutPanel flowLayoutPanel1; // Слева — пункты меню
        private FlowLayoutPanel flowLayoutPanel2; // Справа — панели с содержимым
 
        public UsC()
        {
            InitializeComponent();
        }
 
        private void InitializeComponent()
        {
            this.flowLayoutPanel1 = new FlowLayoutPanel();
            this.flowLayoutPanel2 = new FlowLayoutPanel();
 
            // flowLayoutPanel1 — слева
            this.flowLayoutPanel1.Dock = DockStyle.Left;
            this.flowLayoutPanel1.Width = 200;
            this.flowLayoutPanel1.FlowDirection = FlowDirection.TopDown;
            this.flowLayoutPanel1.WrapContents = false;
            this.flowLayoutPanel1.AutoScroll = true;
            this.flowLayoutPanel1.BackColor = Color.Black;
 
            // flowLayoutPanel2 — справа
            this.flowLayoutPanel2.Dock = DockStyle.Fill;
            this.flowLayoutPanel2.FlowDirection = FlowDirection.TopDown;
            this.flowLayoutPanel2.WrapContents = false;
            this.flowLayoutPanel2.AutoScroll = true;
            this.flowLayoutPanel2.BackColor = Color.FromArgb(64, 64, 64);
 
            this.Controls.Add(flowLayoutPanel2);
            this.Controls.Add(flowLayoutPanel1);
        }
 
        public void BuildMenu(List<MenuItem> menuItems)
        {
            flowLayoutPanel1.Controls.Clear();
            flowLayoutPanel2.Controls.Clear();
 
            int mainIndex = 0;
            foreach (var mainItem in menuItems)
            {
                var ll = new LinkLabel
                {
                    Text = mainItem.Text,
                    Tag = mainIndex.ToString(),
                    AutoSize = true,
                    LinkColor = Color.White,
                    BackColor = Color.Black,
                    Margin = new Padding(3),
                    Cursor = Cursors.Hand,
                    Font = new Font(FontFamily.GenericSansSerif, 10, FontStyle.Bold)
                };
                ll.MouseUp += LinkLabel_MouseUp;
                flowLayoutPanel1.Controls.Add(ll);
 
                var panel = new FlowLayoutPanel
                {
                    Name = "flp" + mainIndex,
                    FlowDirection = FlowDirection.TopDown,
                    WrapContents = false,
                    AutoScroll = true,
                    Dock = DockStyle.Fill,
                    Visible = false,
                    BackColor = Color.FromArgb(64, 64, 64),
                    Padding = new Padding(10)
                };
                flowLayoutPanel2.Controls.Add(panel);
 
                if (mainItem.Data != null)
                {
                    foreach (var subMenu in mainItem.Data)
                    {
                        AddSubMenuPanel(panel, subMenu);
                    }
                }
 
                mainIndex++;
            }
 
            // Выделяем первый пункт меню по умолчанию
            if (flowLayoutPanel1.Controls.Count > 0)
            {
                var first = flowLayoutPanel1.Controls[0] as LinkLabel;
                if (first != null)
                    SelectControl(first);
            }
        }
 
        private void AddSubMenuPanel(FlowLayoutPanel parentPanel, MenuItem menuItem)
        {
            if (menuItem.Data != null && menuItem.Data.Count > 0)
            {
                var header = new Label
                {
                    Text = menuItem.Text,
                    ForeColor = Color.Yellow,
                    AutoSize = true,
                    Font = new Font(FontFamily.GenericSansSerif, 10, FontStyle.Bold),
                    Margin = new Padding
JSON:
JSON
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
[
  {
    "Text": "Меню №1",
    "Data": [
      {
        "Text": "Подменю №11",
        "Data": [
          {
            "Text": "Первая панелька с правой стороны",
            "Data": [
              { "Text": "Кликабельный пункт меню 1", "Copyable": true },
              { "Text": "Кликабельный пункт меню 2", "Copyable": true },
              { "Text": "Некликабельный пункт меню", "Copyable": false },
              { "Text": "Кликабельный пункт меню 3", "Copyable": true },
              { "Text": "Некликабельный пункт №2", "Copyable": false }
            ]
          },
          {
            "Text": "Вторая панелька с правой стороны",
            "Data": [
              { "Text": "Привет, мир.", "Copyable": true },
              { "Text": "Hello world", "Copyable": true }
            ]
          }
        ]
      },
      {
        "Text": "Подменю №12",
        "Data": [
          {
            "Text": "SubSubMenu121",
            "Data": [
              { "Text": "7111", "Copyable": true },
              { "Text": "7112", "Copyable": true }
            ]
          }
        ]
      }
    ]
  }
]
Миниатюры
Копирование строки при клике мышью  
0
bite
 Аватар для I can
5010 / 4832 / 852
Регистрация: 13.04.2015
Сообщений: 10,109
24.09.2025, 10:57
Цитата Сообщение от Pirat Piratych Посмотреть сообщение
туча ошибок
"Ошибки надо не признавать, их надо смывать..." исправлять

Держи.
Вложения
Тип файла: rar C# Навигация.rar (404.5 Кб, 14 просмотров)
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3465 / 2785 / 576
Регистрация: 04.09.2018
Сообщений: 8,763
Записей в блоге: 3
24.09.2025, 19:39
Цитата Сообщение от I can Посмотреть сообщение
Держи.
Обалдеть, почти заплакалъ... Давно такого трешака не видал
0
bite
 Аватар для I can
5010 / 4832 / 852
Регистрация: 13.04.2015
Сообщений: 10,109
24.09.2025, 19:50
Цитата Сообщение от wizard41 Посмотреть сообщение
Давно такого трешака не видал
Вот и пусть разбирается


Не так уж там всё и плохо
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3465 / 2785 / 576
Регистрация: 04.09.2018
Сообщений: 8,763
Записей в блоге: 3
24.09.2025, 20:03
Цитата Сообщение от I can Посмотреть сообщение
Не так уж там всё и плохо
Могло быть и лучше :)

Кажется, тут сама компоновка не верная. ТС устанет впихивать свои итемы в юзерконтролы справа. Короче, не разберется.
"На минималках" могло быть так:
- слева флат-панель с контейнерами менюшек (тема меню, вложенный список итемов);
- справа область окон с соотв. содержимым.
Итемы в левой панельке генерируют события, по которым главная форма показывает соотв. окна в правой панели.. Окна правой части могут содержать в себе свои флат-панели с контейнерами меню..
Контейнеры с меню - это объекты, т.е. как минимум класс.
0
bite
 Аватар для I can
5010 / 4832 / 852
Регистрация: 13.04.2015
Сообщений: 10,109
24.09.2025, 20:12
Цитата Сообщение от wizard41 Посмотреть сообщение
ТС устанет впихивать свои итемы в юзерконтролы справа
Ну если долго через контекстное меню, то можно и в файле добавить.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3465 / 2785 / 576
Регистрация: 04.09.2018
Сообщений: 8,763
Записей в блоге: 3
24.09.2025, 20:17
Ну возьмем, допустим, вот это содержимое:

Каким образом он это запихнет в список из label? Кнопки вот эти и все такое...
Т.е. тут должно быть полноценное окно с содержимым, где и лаблы и кнопки и т.п.
0
bite
 Аватар для I can
5010 / 4832 / 852
Регистрация: 13.04.2015
Сообщений: 10,109
24.09.2025, 20:24
Цитата Сообщение от wizard41 Посмотреть сообщение
Каким образом он это запихнет в список из label?
А то там особенного? Уже сейчас это можно делать, кроме кнопок. Да и их добавить не проблема.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.09.2025, 20:24

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

Как создать кнопку или поле ввода при клике мышью на форме? - C#
Привет, требуется помощь с лабкой, задание 3 курса универа, с# только начали учить в этом...

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

При клике по панели и последующем клике в другом месте затрагиваемая панель должна сменить положение
Уверен, что подобные вопросы задавались не раз и не два, но все же осмелюсь задать вопрос. Итак,...

Выделение строки при наведении на неё мышью
Всем доброго времени суток! Пишу приложение и нужно организовать выделение всей строки в...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru