Как сохранить данные и отобразить их, когда у меня есть некоторые ограничения

#c# #data-binding #data-structures #datagridview

#c# #привязка данных #структуры данных #datagridview

Вопрос:

Сложно указать заголовок…

Я ломаю голову, чтобы разобраться в этой проблеме,

У меня есть пакет, включающий «данные», «время» и «идентификатор».

Мне нужно сохранить их в некоторой структуре данных и каким-то образом отобразить только данные в форме (возможно, datagridview), но мне нужна возможность получать информацию об остальном пакете (время и идентификатор), когда я нажимаю на отображаемые данные.

Например:

0110 1110 0101 0001

Первый идентификатор данных равен 9, а время — 2222. Когда я нажимаю на первые данные (0110), мне нужно отобразить (скажем, в виде метки в форме) id = 9 и time = 2222.

Еще одна вещь, данные должны отображаться так, как в приведенном выше примере (в строке с пробелом между данными.

Редактировать: Я забыл кое-что важное. Если я использую привязку данных, есть возможность изменить расположение данных в сетке (на основе некоторой информации о пакете) из одной ячейки / строки в другую? если нет, возможно, привязка к данным здесь не подходит.

Комментарии:

1. Вы используете WinForms или WPF?

2. что ваша программа делает до сих пор и где застряла? Покажите нам код, который у вас уже есть!

3. @Doc Я не могу показать код. Я могу объяснить почему в личке, если вы хотите. Мне не нужен точный код, только идея.

Ответ №1:

Если я понимаю, что вы пытаетесь сделать, используя DataGridView, попробуйте это:

 // DataGridView

Databing the data source to the DataGridView (use a list of your packet for that)

---------------------------------
| DATA 1 | DATA 2 | DATA 3 | ... (Header)
---------------------------------
|  0110  |  1110  |  0101  | ... (Data)
---------------------------------
  

Добавьте обработчик событий в DataGridView CellContentClick, точно так же, как это:

 private void myDataGrid_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    if (e.RowIndex > -1 amp;amp; e.ColumnIndex > -1) // A row and cell was selected
    {
        var packet = myDataGrid.Rows[e.RowIndex].DataBoundItem as Packet;
        if (packet != null)
        {
            // Display packet information
        }
    }
}
  

Надеюсь, это поможет.

Комментарии:

1. Спасибо, Марко (?). но если мой список является источником данных, как datagrid узнает, что нужно отображать только данные?

2. Вы можете задать столбцы, которые вы хотите отобразить в datagridview. Просто определите столбцы во время разработки и установите для свойства AutoGenerateColumns (я думаю, это название) значение «false».

Ответ №2:

Сделайте свой пакет классом, в котором данные, время и идентификатор являются частными членами и DisplayData являются общедоступным свойством. Чтобы получить доступ к содержимому закрытых элементов извне, используйте свойства с [Browsable(false)] атрибутом:

 public class Packet
{
    private int data, time, id;

    public string DisplayData {get {return FunctionToFormatDataToMyNeeds(data); }}
    // ...

    [Browsable(false)]
    public int Time{get{return time;}}
}
  

Привяжите список этих объектов к источнику данных вашего DataGridView.