#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.