Автоматически автоматически проверять каждый новый элемент в списке проверенных в c # - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь автоматически проверять каждый новый элемент в моем проверенном списке. У меня есть кнопка, которая автоматически выбирает все, но мы не хотим, чтобы таким способом управляла кнопка.мы хотим, чтобы каждый новый элемент, который мы получаем автоматически, проверялся.

Это моя кнопка, которая автоматически выбирает все, если есть новые 20 элементов, автоматически выбирает все и затем отправляет эти новые элементы

Вот код, который работает, но я не хочу, я хочу автоматически выбирать каждый приходящий новый элемент, потому что у меня есть другой процесс, который будет продолжать добавлять новые элементы в список проверенных блоков, также lst_BarcodeScanEvents - это имя списка проверенных элементов

private void btn_SelectALLScans_Click(object sender, EventArgs e)
        {
            for (var i = 0; i < lst_BarcodeScanEvents.Items.Count; i++)
            {
                lst_BarcodeScanEvents.SetItemChecked(i, true);
            }
        }

Я проверил другие источники, такие как google и stackoverflow, но не смог найти что-либо для своего запроса здесь.

Вот основной класс, в котором у меня есть логика кнопок, флажок и многое другое.и метод кнопки btn_ConnectT_Click вызывает методы из второго класса

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using System.Web;
using BarcodeReceivingApp.Core.Domain;
using BarcodeReceivingApp.Functionality;

namespace BarcodeReceivingApp
{
    public partial class BarcodeReceivingForm : Form
    {
        //GLOBAL VARIABLES
        private const string Hostname = "myip";
        private const int Port = 23;
        private TelnetConnection _connection;
        private ParseReceivingBarcode _parseReceivingBarcode;
        private ButtonsDisplay _buttonsDisplay;


        public BarcodeReceivingForm()
        {
            InitializeComponent();
            //FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            WindowState = FormWindowState.Maximized;
        }

        private void btn_ConnectT_Click(object sender, EventArgs e)
        {
            _connection = new TelnetConnection(Hostname, Port);
            _connection.ServerSocket(Hostname, Port, this);
        }

        private void btn_StopConnection_Click(object sender, EventArgs e)
        {
            _connection.Exit();
        }

        private void btn_RemoveItemFromListAt_Click(object sender, EventArgs e)
        {
            if (lst_BarcodeScanEvents.CheckedItems.Count != 0)
                for (var i = lst_BarcodeScanEvents.CheckedItems.Count; i > 0; i--)
                    lst_BarcodeScanEvents.Items.RemoveAt(lst_BarcodeScanEvents.CheckedIndices[i - 1]);
            else
                MessageBox.Show(@"Element(s) Not Selected...");
        }

        private void BarcodeReceivingForm_Load(object sender, EventArgs e)
        {
            _buttonsDisplay = new ButtonsDisplay(this);
            _buttonsDisplay.ButtonDisplay();
        }

        private void btn_ApplicationSettings_Click(object sender, EventArgs e)
        {
            var bcSettingsForm = new BarcodeReceivingSettingsForm();
            bcSettingsForm.Show();
        }

        private void btn_ClearBarcodeList_Click(object sender, EventArgs e)
        {
            lst_BarcodeScanEvents.Items.Clear();
        }

        private void lst_BarcodeScanEvents_ItemAdded(object sender, ListBoxItemEventArgs e)
        {
            MessageBox.Show(@"Item was added at index " + e.Index + @" and the value is " + lst_BarcodeScanEvents.Items[e.Index].ToString());                          
        }

        private void btn_SubmitData_Click(object sender, EventArgs e)
        {
            var receivingFullBarcode = new List<string>();
            _connection.GetBarcodeList();
        }

        private void btn_SelectALLScans_Click(object sender, EventArgs e)
        {
            for (var i = 0; i < lst_BarcodeScanEvents.Items.Count; i++)
            {
                lst_BarcodeScanEvents.SetItemChecked(i, true);
            }
        }

    }
}

Вот второй класс, в котором я использую порт telnet 23, который сканирует штрих-коды, где и помещает его в флажок списка, теперь основные методы здесь, которыевставляет данные в флажок проверенного списка - это метод serversocket и метод readwrite

using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace BarcodeReceivingApp.Functionality
{
    public class TelnetConnection
    {
        private Thread _readWriteThread;
        private TcpClient _client;
        private NetworkStream _networkStream;
        private string _hostname;
        private int _port;
        private BarcodeReceivingForm _form;
        private bool _isExiting = false;

        public TelnetConnection(string hostname, int port)
        {
            this._hostname = hostname;
            this._port = port;
        }

        public void ServerSocket(string ip, int port, BarcodeReceivingForm f)
        {
            this._form = f;
            try
            {
                _client = new TcpClient(ip, port);
            }
            catch (SocketException)
            {
                MessageBox.Show(@"Failed to connect to server");
                return;
            }
            _networkStream = _client.GetStream();
            _readWriteThread = new Thread(ReadWrite);
            //_readWriteThread = new Thread(() => ReadWrite(f));
            _readWriteThread.Start();
        }

        public void Exit()
        {
            _isExiting = true;
        }

        public void ReadWrite()
        {
            do
            {
                var received = Read();
                if (received == null)
                    break;

                if (_form.lst_BarcodeScanEvents.InvokeRequired)
                {
                    var received1 = received;
                    _form.lst_BarcodeScanEvents.Invoke(new MethodInvoker(delegate
                    {
                        _form.lst_BarcodeScanEvents.AddItem(received1 + Environment.NewLine);
                    }));
                }
            } while (!_isExiting);

            //var material = received.Substring(10, 5);
            //_form.label5.Text += string.Join(Environment.NewLine, material);

            CloseConnection();

        }

        public List<string> GetBarcodeList()
        {
            var readData = new List<string>();

            foreach (string list in _form.lst_BarcodeScanEvents.Items)
            {
                readData.Add(list);
                MessageBox.Show(list);
            }

            return readData;
        }
        public string Read()
        {
            var data = new byte[1024];
            var received = "";

            var size = _networkStream.Read(data, 0, data.Length);
            if (size == 0)
                return null;

            received = Encoding.ASCII.GetString(data, 0, size);

            return received;
        }

        public void CloseConnection()
        {
            MessageBox.Show(@"Closed Connection",@"Important Message");
            _networkStream.Close();
            _client.Close();
        }
    }
}

, поэтому, как я уже говорил ранее, для каждого нового элемента он вставляется в флажок проверенного списка. Я хочу, чтобы он выбирался автоматически при каждом добавленииновые данные в проверенном списке.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Проблема, обычно простая, в установке состояния Checked для вновь добавленного элемента в CheckedListBox, была несколько сложной из-за природы рассматриваемого списка.

CheckedListBox - это пользовательский элемент управления с настраиваемыми событиями и свойствами.
На самом деле это довольно распространенная настройка (одну реализацию можно увидеть в этом сообщении на форуме MSDN:
Есть ListBox исобытие при добавлении или удалении элементов? ), но это может усложнить интерпретацию событий.

Пользовательский элемент управления при добавлении нового элемента в список (из класса, отличного от формы, в которой находится элемент управления), вызывает пользовательское ItemAdded событие

private void [CheckedListBox]_ItemAdded(object sender, ListBoxItemEventArgs e)

Пользовательские объекты ListBoxItemEventArgs ссылаются на индекс элемента, добавленный через объект e.Index.
С помощью предоставленного кода можно определить, что этот обработчик события является естественное место, где можно установить состояние Checked нового предмета:

private void lst_BarcodeScanEvents_ItemAdded(object sender, ListBoxItemEventArgs e)
{
    lst_BarcodeScanEvents.SetItemChecked(e.Index, true);
}
0 голосов
/ 14 февраля 2019

Для этого я предлагаю создать событие, на которое вы подписываетесь после InitializeComponent () вашей формы, примерно так:

    public Form1()
    {
        InitializeComponent();
        lst_BarcodeScanEvents.ControlAdded += new ControlEventHandler(AddedNewSelect);
    }

    private void AddedNewSelect(object sender, ControlEventArgs e)
    {
        lst_BarcodeScanEvents.SetItemChecked(e.Control.TabIndex, true);
    }
...