Как передать в конструктор класса ссылку на объект, например передать DataGridView в конструктор
Есть класс в котором хранятся обработанные данные, в этот класс добавил метод который выбирает нужные данные из этого класса и выводит в DataGridView. Как теперь правильно добавить ссылку в конструктор класса например на DataGridView1, чтобы при создании экземпляра этого класса я сразу же добавлял DataGridView с которым нужно работать? В C# я новичек, но знаю хорошо просто язык СИ.
class CAN_Sniffer_Rx
{
public CAN_Sniffer_Rx( DataGridView dg)
{
_button_rx_on_off = false;
_number_of_last_line= 0;
dgvw = dg;
}
public uint[] _id = new uint[max_message];
public byte[] _dlc = new byte[max_message];
public byte[,] _data = new byte[max_message,8];
public ushort[] _message_counter = new ushort[max_message];
public ushort[] _message_period = new ushort[max_message];
public byte _number_of_last_line;
//public byte _number_of_current_line;
public bool _button_rx_on_off;
private DataGridView dgvw;
public void CAN_Prlc_Show_in_the_dG()
{
for (int i = 0; i < _number_of_last_line; i++)//
{
//Invoke(new Action(() =>
//{
if (dgvw.RowCount < _number_of_last_line) dgvw.Rows.Add(); //добавляем поля
dgvw.Rows[i].Cells[0].Value = i + 1;
dgvw.Rows[i].Cells[1].Value = _id[i].MyConvertToHEX();
dgvw.Rows[i].Cells[2].Value = _dlc[i];
for (byte cell = 3, p = 0; p < 8; cell++, p++)
{
dgvw.Rows[i].Cells[cell].Value = _data[i,p].MyConvertToHEX();
}
dgvw.Rows[i].Cells[11].Value = _message_counter[i];
dgvw.Rows[i].Cells[12].Value = _message_period[i];
dgvw.Update();
// }));
}
}
}
CAN_Sniffer_Rx can_sniffer_rx = new CAN_Sniffer_Rx(dataGrid_CAN1);
Ответы (2 шт):
С начала начну не с самой ошибки, а с кода.
- Замените массивы на класс и массив этого класса.
- В C# не принято разделять слова с помощью _, как это в Java или в Си, используйте "_numberOfLastLine", вместо "_number_of_last_line"
Для решения проблемы вам нужен отдельный публичный класс / статичный класс, в моём решении я для удобства использую статичный класс.
File User.cs:
using static Wrapper;
public class User
{
public uint ID { get; set; }
public byte DLC { get; set; }
public byte[] Data { get; set; } = new byte[8];
public ushort MessageCounter { get; set; }
public ushort MessagePeriod { get; set; }
}
File CanSnifferRx.cs:
using static Wrapper;
class CANSnifferRx
{
public CANSnifferRx(DataGridView dg)
{
buttonRxOnOff = false;
numberOfLastLine = 0;
dgvw = dg;
}
public User[] users = new User[numberOfLastLine]();
public byte numberOfLastLine;
public bool buttonRxOnOff;
private DataGridView dgvw;
public void CAN_Prlc_Show_in_the_dG()
{
for (int i = 0; i < numberOfLastLine; i++)
{
User user = users[i];
if (dgvw.RowCount < numberOfLastLine) dgvw.Rows.Add();
dgvw.Rows[i].Cells[0].Value = i + 1;
dgvw.Rows[i].Cells[1].Value = user.ID.MyConvertToHEX();
dgvw.Rows[i].Cells[2].Value = user.DLC;
for (byte cell = 3, p = 0; p < 8; cell++, p++)
{
dgvw.Rows[i].Cells[cell].Value = user.Data[i, p].MyConvertToHEX();
}
dgvw.Rows[i].Cells[11].Value = user.MessageCounter;
dgvw.Rows[i].Cells[12].Value = user.MessagePeriod;
dgvw.Update();
}
}
}
CANSnifferRx canSnifferRx = new CANSnifferRx(dataGridCAN1);
File Wrapper.cs:
public static class Wrapper
{
public static DataGridView dgvw = new DataGridView ();
}
@Yotic, изначально я просто добавил класс со статическими полями и данные с буфера просто пихал туда, типо как в структуру на языке СИ, но сам понимал что не правильно делаю, но данные в дата грид с буфера выводились и выводятся, результат есть. Сейчас задумал добавить еще один дата грид и выводить еще одни данные на основе этого класса(читать две линии CAN-шины одновременно) Изначально было вот так, отдельный метод сюда запихивал данные, другой в отдельном потоке читал их из этого класса:
class CAN_RX_Class
{
static public uint[] Id = new uint[max_message];
static public byte[] DLC = new byte[max_message];
static public byte[] Byte0 = new byte[max_message];
static public byte[] Byte1 = new byte[max_message];
static public byte[] Byte2 = new byte[max_message];
static public byte[] Byte3 = new byte[max_message];
static public byte[] Byte4 = new byte[max_message];
static public byte[] Byte5 = new byte[max_message];
static public byte[] Byte6 = new byte[max_message];
static public byte[] Byte7 = new byte[max_message];
static public ushort[] CAN_count = new ushort[max_message];
static public ushort[] CAN_period = new ushort[max_message];
static public ushort number_last_string;
// static public ushort current_line_number = 0;
}
А это результат сегодняшнего труда. Создаю экземпляр этого класса и запихиваю туда данные с _bufer, далее в этом классе есть метод который распихивает по полочкам данные, и метод который выводит во внесенный в него в качестве параметра датагрид, теперь на основании этого, могу создать еще экземпляр и обработать еще одни отдельные данные:
public partial class Form1 : Form
{
CAN_Sniffer_Rx can_sniffer_rx = new CAN_Sniffer_Rx(); //экземпляр класса ******************************************************************************
bool FlagBtnStartStopClick, FlagBtnSendToCAN;
bool FlagBtnOpenClick;
private const int DataSize = 256; // число в байтах
private static readonly byte[] _bufer = new byte[DataSize];
private int _stepIndex;
private bool _startRead;
private const ushort maxMessage = 256;
private const byte firstFiveByte = 5;
private const byte sizeOfcrc = 4;//4 байта CRC
private const byte sizeOfStartsByte = 5;//5 байт начальных
private byte rowIndexDataGridCAN1click = 0;//по щелчку ячейки сюда попадают значения
private bool microcontrolerBusy = false, recordErrorCRC = false, sendCANmsgBusy = false;
class CAN_Sniffer_Rx
{
public CAN_Sniffer_Rx()
{
_ButtonRxOnOff = false;
_NumberOfLastLine = 0;
}
public uint[] _id = new uint[maxMessage];
public byte[] _dlc = new byte[maxMessage];
public byte[,] _data = new byte[maxMessage, 8];
public ushort[] _MessageCounter = new ushort[maxMessage];
public ushort[] _MessagePeriod = new ushort[maxMessage];
public byte _NumberOfLastLine;
public bool _ButtonRxOnOff;
public void CAN_Prlc_Show_in_the_dG(ref DataGridView dgvw)
{
for (int i = 0; i < _NumberOfLastLine; i++)//
{
if (dgvw.RowCount < _NumberOfLastLine) dgvw.Rows.Add(); //добавляем поля
dgvw.Rows[i].Cells[0].Value = i + 1;
dgvw.Rows[i].Cells[1].Value = _id[i].MyConvertToHEX();
dgvw.Rows[i].Cells[2].Value = _dlc[i];
for (byte cell = 3, p = 0; p < 8; cell++, p++)
{
dgvw.Rows[i].Cells[cell].Value = _data[i, p].MyConvertToHEX();
}
dgvw.Rows[i].Cells[11].Value = _MessageCounter[i];
dgvw.Rows[i].Cells[12].Value = _MessagePeriod[i];
dgvw.Update();
}
}
public void CAN_Sniffer_handler()
{
//начальный массив для проверки по id >>
uint ID_array = 0;
for (byte j = 5, offset = 28; j <= 12; j++, offset -= 4)
ID_array += (uint)((_bufer[j].MyAsciiToHex()) << offset);
//<<
for (ushort i = 0; i <= _NumberOfLastLine; i++)
{
if (ID_array == _id[i])
{
//Формируем DLC
_dlc[i] = (byte)(((_bufer[13].MyAsciiToHex()) << 4) + (_bufer[14].MyAsciiToHex()));
//Формируем DATA
for (byte s = 15, t = 0; t < 8; s += 2, t++)
_data[i, t] = (byte)(((_bufer[s].MyAsciiToHex()) << 4) + (_bufer[s + 1].MyAsciiToHex()));
//формируют Counter
_MessageCounter[i] = 0;
for (byte j = 31, offset = 12; j <= 34; j++, offset -= 4)
_MessageCounter[i] += (ushort)((_bufer[j].MyAsciiToHex()) << offset);
//формируем period
_MessagePeriod[i] = 0;
for (byte j = 35, offset = 12; j <= 38; j++, offset -= 4)
_MessagePeriod[i] += (ushort)((_bufer[j].MyAsciiToHex()) << offset);
break;
}
else if (i == _NumberOfLastLine)
{
//формируем ID
_id[i] = ID_array;
//Формируем DLC
_dlc[i] = (byte)(((_bufer[13].MyAsciiToHex()) << 4) + (_bufer[14].MyAsciiToHex()));
//Формируем DATA
for (byte s = 15, t = 0; t < 8; s += 2, t++)
_data[i, t] = (byte)(((_bufer[s].MyAsciiToHex()) << 4) + (_bufer[s + 1].MyAsciiToHex()));
//формируют Counter
_MessageCounter[i] = 0;
for (byte j = 31, offset = 12; j <= 34; j++, offset -= 4)
_MessageCounter[i] += (ushort)((_bufer[j].MyAsciiToHex()) << offset);
//формируем period
_MessagePeriod[i] = 0;
for (byte j = 35, offset = 12; j <= 38; j++, offset -= 4)
_MessagePeriod[i] += (ushort)((_bufer[j].MyAsciiToHex()) << offset);
//инкрементируем строку
_NumberOfLastLine++;
break;
}
}
}
}
Но почитав ваше сообщение @Yotic, понял что это тоже не то, попробую как-то еще разнести массивы в отдельный класс
Замените массивы на класс и массив этого класса.
Пока не совсем понятно, изучу ваш пример, спасибо.
