Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/22: Рейтинг темы: голосов - 22, средняя оценка - 4.50
60 / 185 / 31
Регистрация: 14.02.2013
Сообщений: 1,683

Не пойму как очистить массив строк

11.04.2023, 20:46. Показов 5045. Ответов 101
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Перепробовал все методы но не выходит. Есть переменная string[] PortCOM; она заполняется из метода SerialPort.GetPortNames();
но нужно потом очистить PortCOM. Как это сделать?
C#
1
2
string[] PortCOM;  
PortCOM = SerialPort.GetPortNames();
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.04.2023, 20:46
Ответы с готовыми решениями:

Как очистить таблицу в БД от строк
пробовал ставить на кнопку while (bDDataSet.1.Rows.Count>0) { bDDataSet.1.Rows.RemoveAt(0); } ...

Как очистить массив
Как очистить массив?

Как очистить только первую колонку всех строк в DataGridView не затрагивая другие?
Как очистить только первую колонку всех строк в DataGridView не затрагивая другие ?

101
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,844
Записей в блоге: 1
11.04.2023, 21:10
Цитата Сообщение от VladimirU Посмотреть сообщение
но нужно потом очистить PortCOM
Зачем?

Цитата Сообщение от VladimirU Посмотреть сообщение
Есть переменная string[] PortCOM;
Переменная или поле класса?
0
60 / 185 / 31
Регистрация: 14.02.2013
Сообщений: 1,683
11.04.2023, 21:37  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Зачем?
Из за этой переменной или поле класса не знаю, отображаются предыдущий текст в comboBox1 хотя я его очищаю методом comboBox1.Items.Clear();.

Метод SerialPort.GetPortNames(); он же не перезаписывает строки в массив string[] PortCOM;, а добавляет со сдвигам в низ.

Добавлено через 14 минут
OwenGlendower, получается вот така фигня
https://youtu.be/TBH_9y7o-qw
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,844
Записей в блоге: 1
11.04.2023, 22:28
VladimirU, метод GetPortNames возвращает новый массив. Добавлять он ничего не должен. Скорее ошибка в вашем коде. Показывайте его целиком. Попробуем разобраться.
0
60 / 185 / 31
Регистрация: 14.02.2013
Сообщений: 1,683
11.04.2023, 22:53  [ТС]
Хорошо завтра выложу.
0
60 / 185 / 31
Регистрация: 14.02.2013
Сообщений: 1,683
12.04.2023, 06:33  [ТС]
OwenGlendower, вот код. Начиная со строки 58-92 идёт очистка и присвоение значений форме comboBox1 из метода SerialPort.GetPortNames(); через переменную PortCOM;
Смысл такой что при запуски программы происходит чтение всех портов COM и перечисление их в выпадающие меню. После выбора нужного порта из выпадающего меню программа подключается к выбранному порту и запускается таймер слежения строки 122-126 за состоянием подключенного порта, как только порт исчезает из системы в методе public void Sp_Tipm() строка 46 происходит его закрытие и новый перезапуск из строки 55 вот после этого и начинает глючит форма comboBox1.

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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.Timers;
using System.Threading;
namespace WindowsFormsApplication1
{
   
    public partial class Form1 : Form
    {
        byte[] data_r = new byte[4];
                                                                                     //  Для списка доступных COM 
        String[] PortCOM;
        string TempPort;
        long data_r_l = 0;
        long tmp = 0;
        public System.Timers.Timer _timer = new System.Timers.Timer();
        public SerialPort _serialPort = new SerialPort();
 
        public delegate void SetReceivedDeleg(byte[] data_r);
        public delegate void SetTim();
        public class Temp
        {
 
        }
        public Form1()
        {
            InitializeComponent();
            Application.ApplicationExit += new EventHandler(OnApplicationExit); //для события при закрытии программы
        }
//====================================================================================================================================================================
 
                                               //Поток таймера _timer слежения за состоянием COM
 
        public void Trigtim(object sender, System.Timers.ElapsedEventArgs e)
        {
            BeginInvoke(new SetTim(Sp_Tipm));
 
        }
        public void Sp_Tipm()
        {
            if (_serialPort.IsOpen == false)                           //Выполнит если порт исчез
            {
                _timer.Stop();
                _serialPort.DataReceived -= new SerialDataReceivedEventHandler(_serialPort_DataReceived); //Сброс ожидания события от приёмника COM
                _serialPort.ErrorReceived -= new SerialErrorReceivedEventHandler(_serialPort_ErrorReceived);  //Сброс события если в COM произошол сбой
                _timer.Elapsed -= new ElapsedEventHandler(Trigtim);
                _serialPort.Close();
                Form1_Load(null, null);
                MessageBox.Show("Исчез COM");
                
                
            }
        }
//====================================================================================================================================================================
//====================================================================================================================================================================
 
                                            //Закрывает COM порт при закрытии программы
 
        private void OnApplicationExit(object sender, EventArgs e)                                      //Событие при закрытии программы
        {
            _timer.Stop();
            if (_serialPort.IsOpen == true)                                                             //Выполнит если порт открыт
            {
                _serialPort.DiscardInBuffer();
                _serialPort.DiscardOutBuffer();
                _serialPort.Close();
                
            }
        }
//====================================================================================================================================================================
//====================================================================================================================================================================
 
                                                                    //Выбор и инициализация COM порта
 
        private void Form1_Load(object sender, EventArgs e)
        {
            _serialPort.Close();
            comboBox1.SelectedIndex = -1;                                                              //Очищает текущее отображение comboBox1
            comboBox1.Items.Clear();                                                                   //Полностью очищает весь список comboBox1
            try                                                                                        //следит за наличием доступных COM в системе
            {
                
                PortCOM = SerialPort.GetPortNames();                                                   //Получает список доступных COM в массив PortCOM
                comboBox1.Items.AddRange(PortCOM);                                                     //Помещает список COM в форму comboBox1
                comboBox1.SelectedIndexChanged += listBox1_SelectedIndex;                              //Создаёт событие для выбора из выподающего списка comboBox1
 
            }
            catch (Win32Exception)                                                                     //выполняет если портов COM нет в системе
            {
                comboBox1.SelectedIndexChanged -= listBox1_SelectedIndex;                              //Удаляет событие для выбора из выподающего списка comboBox1
                MessageBox.Show("Нет доступных COM");
            }
        }
        public void listBox1_SelectedIndex(object sender, EventArgs e)                                 //Выполняет событие для выбора из выподающего списка comboBox1
        {
            
            _serialPort.Close();
            comboBox1.SelectedIndexChanged -= listBox1_SelectedIndex;                                  //Удаляет событие для выбора из выподающего списка comboBox1
            TempPort = comboBox1.SelectedItem.ToString();                                              //имя выбраного порта в системе
            _serialPort.PortName = TempPort;                                                           //Задаём имя из comboBox1 для порта для работы
            try                                                                                        //Контроль правельности открытия выбраного порта
            {
                _serialPort.Open();                                                                    //Открываем выбранный порт
            }
            catch (UnauthorizedAccessException)                                                        //Если что то пошло не так
            {
                _serialPort.Close();                                                                   //Закрываем выбранный порт
                MessageBox.Show("Отказ в доступе к порту", TempPort);
            }
            Thread.Sleep(100);                                                                         //Системная задержка
            if (_serialPort.IsOpen == true)
            {
                _serialPort.DataReceived += new SerialDataReceivedEventHandler(_serialPort_DataReceived); //Запуск ожидания события от приёмника COM
                _serialPort.ErrorReceived += new SerialErrorReceivedEventHandler(_serialPort_ErrorReceived);  //Запуск события если в COM произошол сбой
                _timer.Elapsed += new ElapsedEventHandler(Trigtim);                             //запускает событие слежение за портом COM в системе
                _timer.AutoReset = true;                                                         //мониторит каждые 0.5 сек
                _timer.Enabled = true;                                                           //если порт исчез вызывает метод Trigtim
                _timer.Interval = 500;
                _timer.Start();
                MessageBox.Show("Открыт", TempPort);
            }
            else if (_serialPort.IsOpen == false)
                MessageBox.Show("Не открылся", TempPort);
        }
 
        void _serialPort_ErrorReceived(object sender, SerialErrorReceivedEventArgs e)                  //Выполнить после сбоя COM порта
        {
            _serialPort.Close();
            _serialPort.DataReceived -= new SerialDataReceivedEventHandler(_serialPort_DataReceived); //Сброс ожидания события от приёмника COM
            _serialPort.ErrorReceived -= new SerialErrorReceivedEventHandler(_serialPort_ErrorReceived);  //Сброс события если в COM произошол сбой
                
            MessageBox.Show("Сбой", TempPort);
        }
 
//====================================================================================================================================================================
//====================================================================================================================================================================
 
                                                                         //Приём данный и обработка из COM
        void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)                     //Переход в метод кода пришли данные COM
        {
            if (_serialPort.IsOpen == true)
            {
                _serialPort.Read(data_r, 0, 4);                                                        //Чтение данных из COM в data_r
                BeginInvoke(new SetReceivedDeleg(si_DataReceived), data_r);                            //Отдельный поток для переброса данных из COM
 
            }
            else if (_serialPort.IsOpen == false)                                                      //Если COM порт закрыт то
            {
                _serialPort.DataReceived -= new SerialDataReceivedEventHandler(_serialPort_DataReceived); //Остановка ожидания события от приёмника COM
                MessageBox.Show("Закрыт", TempPort);
            }
        }
        public void si_DataReceived(byte[] data_r)                                                     //Тут обработка данных из COM полученные через поток BeginInvoke
        {
            _serialPort.DataReceived -= new SerialDataReceivedEventHandler(_serialPort_DataReceived);  //Возможно лишнее время покажет
            data_r_l = BitConverter.ToInt32(data_r, 0);                                                //Собираем из массива data_r в переменную data_r_l
            label1.Text = String.Format("Данные COM  {0}", data_r_l);
            _serialPort.DataReceived += new SerialDataReceivedEventHandler(_serialPort_DataReceived);  //Возможно лишнее время покажет
        }
 
        public void textBox1_TextChanged(object sender, EventArgs e)  //  Скорость милл/мин
        {
 
        }
 
        public void textBox2_TextChanged(object sender, EventArgs e)  //  К задан. коорд. милл
        {
 
        }
 
        public void label1_Click(object sender, EventArgs e)  //  Данные COM
        {
 
        }
        public void label2_Click(object sender, EventArgs e)  //  Скорость милл/мин
        {
 
        }
        public void label3_Click(object sender, EventArgs e)  //  К задан. коорд. милл
        {
 
        }
 
        public void button1_Click(object sender, EventArgs e)  // <<<
        {
 
        }
 
        public void button2_Click(object sender, EventArgs e)  // >>>
        {
 
        }
 
        public void button3_Click(object sender, EventArgs e)  //Пуск
        {
 
        }
 
        public void button4_Click(object sender, EventArgs e)  //Стоп
        {
 
        }
 
        public void progressBar1_Click(object sender, EventArgs e)  //  Левый
        {
 
        }
 
        public void progressBar2_Click(object sender, EventArgs e)  //  Правый
        {
 
        }
 
        private void label4_Click(object sender, EventArgs e)
        {
 
        }
 
 
 
    }
}
0
60 / 185 / 31
Регистрация: 14.02.2013
Сообщений: 1,683
12.04.2023, 14:21  [ТС]
OwenGlendower, у данного метода comboBox1.Items.AddRange(PortCOM); есть свои переменные какие нибудь буферные? Может где то в них остаётся информация?
Вообще не как не выходит решить данную проблему.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3385 / 2705 / 573
Регистрация: 04.09.2018
Сообщений: 8,519
Записей в блоге: 3
12.04.2023, 18:03
Цитата Сообщение от VladimirU Посмотреть сообщение
не как не выходит решить данную проблему.
C#
1
comboBox.Item.Clear();
?
0
60 / 185 / 31
Регистрация: 14.02.2013
Сообщений: 1,683
12.04.2023, 18:08  [ТС]
wizard41, есть такое строка 85, 85 даже вот так делаю
C#
1
2
 comboBox1.SelectedIndex = -1;                          //Очищает текущее отображение comboBox1
            comboBox1.Items.Clear();
Самое интересно пихал счётчик между строк так он увеличивается как положено один раз.

Добавлено через 2 минуты
Но уже догадываюсь связано это с событием самого comboBox.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3385 / 2705 / 573
Регистрация: 04.09.2018
Сообщений: 8,519
Записей в блоге: 3
12.04.2023, 18:09
Цитата Сообщение от VladimirU Посмотреть сообщение
C#
1
comboBox1.SelectedIndex = -1;
Это что за чушь?
Цитата Сообщение от VladimirU Посмотреть сообщение
даже вот так делаю
Цитата Сообщение от VladimirU Посмотреть сообщение
C#
1
comboBox1.Items.Clear();
Зачем очищать и так пустой список итемов при загрузке формы? Ну ерунду пишешь, е мое.

Добавлено через 1 минуту
VladimirU, каша масляная у тебя, а не код. Либо разбирайся в ней сам, либо переделывай заново.
0
60 / 185 / 31
Регистрация: 14.02.2013
Сообщений: 1,683
12.04.2023, 21:22  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
Либо разбирайся в ней сам, либо переделывай заново.
Разбираюсь. Месяца ещё не прошло как сел за C# с её там ООП. Item фак.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3385 / 2705 / 573
Регистрация: 04.09.2018
Сообщений: 8,519
Записей в блоге: 3
12.04.2023, 21:25
VladimirU, создай метод обновления комбокса и вызывай его в нужных местах. Все просто.
0
60 / 185 / 31
Регистрация: 14.02.2013
Сообщений: 1,683
12.04.2023, 22:13  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
создай метод обновления комбокса и вызывай его в нужных местах. Все просто.
Сомневаюсь что прокатит но попробую. Вызов метода Form1_Load и есть обновление комбокса.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3385 / 2705 / 573
Регистрация: 04.09.2018
Сообщений: 8,519
Записей в блоге: 3
12.04.2023, 23:34
Цитата Сообщение от VladimirU Посмотреть сообщение
Вызов метода Form1_Load и есть обновление комбокса
Забудь эту мысль навсегда.

Добавлено через 58 минут
VladimirU, про ObservableCollection<T> слышал что-нибудь? Это самое то, что те нужно.

Добавлено через 14 минут
Ну, или начни хотя бы с этого:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
readonly List<string> comports = new List<string>();
 
public Form1()
{
    InitializeComponent();
    ComPortListUpdate();
    comboBox1.DataSource = comports;
}
 
void ComPortListUpdate()
{
    comports.Clear();
    foreach (string comport in SerialPort.GetPortNames())
        comports.Add(comport);
}
0
60 / 185 / 31
Регистрация: 14.02.2013
Сообщений: 1,683
13.04.2023, 10:26  [ТС]
Нашёл от куда повторы в comboBox лезут, а лезут они из
C#
1
SerialPort.GetPortNames();
только не ясно из за чего.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3385 / 2705 / 573
Регистрация: 04.09.2018
Сообщений: 8,519
Записей в блоге: 3
13.04.2023, 12:23
Цитата Сообщение от VladimirU Посмотреть сообщение
Нашёл от куда повторы в comboBox лезут
Не правильно нашел. Третий раз уже говорю - очищай комбобокс при добавлении портов (при новых вызовах SerialPort.GetPortNames()).
0
60 / 185 / 31
Регистрация: 14.02.2013
Сообщений: 1,683
13.04.2023, 13:07  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
очищай комбобокс при добавлении портов (при новых вызовах SerialPort.GetPortNames()).
Так и делаю строки 85, 86. Боз толку.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3385 / 2705 / 573
Регистрация: 04.09.2018
Сообщений: 8,519
Записей в блоге: 3
13.04.2023, 13:10
Цитата Сообщение от VladimirU Посмотреть сообщение
Так и делаю
Не там делаешь. Да и не совсем то.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3385 / 2705 / 573
Регистрация: 04.09.2018
Сообщений: 8,519
Записей в блоге: 3
13.04.2023, 13:18
Сканирование портов при загрузке программы:

Отключим 11-й порт и нажмем кнопку "Сканировать":

Снова подключим 11-й порт и нажмем сканировать:

И так можно нажимать эту кнопку до второго пришествия - никаких повторов не будет!

Весь код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            ComPortListUpdate();
        }
 
        void ComPortListUpdate()
        {
            string[] comports = SerialPort.GetPortNames();
            comboBox1.DataSource = comports;
        }
 
        private void buttonRescan_Click(object sender, System.EventArgs e)
        {
            ComPortListUpdate();
        }
    }
0
60 / 185 / 31
Регистрация: 14.02.2013
Сообщений: 1,683
13.04.2023, 13:25  [ТС]
wizard41, проверил 10 раз именно строки лишние выкидывает из SerialPort.GetPortNames(); и самое главное после того как вызовешь _serialPort.Open();. До вызова вот такой код отрабатывает без глюков

C#
1
2
3
4
comboBox1.SelectedIndex = -1;  
listBox1.Items.Clear();
PortCOM = SerialPort.GetPortNames();
comboBox1.Items.AddRange(PortCOM);
Добавлено через 2 минуты
И так пробовал всё одно. comboBox1.DataSource = comports;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.04.2023, 13:25
Помогаю со студенческими работами здесь

Как очистить статический массив?
у меня в классе обявлен статический массив - static overall_data* array_persone; после класса задаю размер overall_data*...

Как очистить массив выделеной памяти
#include &lt;iostream&gt; #include &lt;string.h&gt; #include &lt;cstdlib&gt; using namespace std; int main() { int koltest; int...

Как очистить статический массив структур?
structure A { char name; int weight; }; A B; В массив &quot;В&quot; я считал текстовый файл, теперь его нужно очистить что-бы считать...

Как очистить или удалить массив BitmapImage
Создаю галерею картинок. В массив из БД определенного раздел записываю urlы картинок. Все работает хорошо. Проблема в том что массив ни...

Можно ли очистить новый массив от нулей и как
Вообщем вот задание: Дан целочисленный массив A размера N. Переписать в новый целочисленный массив B все четные числа из исходного массива...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru