Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
3 / 3 / 2
Регистрация: 20.12.2014
Сообщений: 54

Как Dictionary<string, List<string>> поместить в DataGrid ?

28.08.2015, 21:33. Показов 5543. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Подскажите пожалуйста как поместить в DataGrid словарь Dictionary<string, List<string>>, с возможностью редактирования словаря, т.е. так, чтобы из DataGrid можно было добавить новую запись в словарь, изменить существующую запись и удалить имеющуюся? DataGrid должен выглядеть как на картинке. Размер списков не известен и у каждого ключа он разный. ... Одна строка DataGrid'a содержит в первом столбце key а все остальные столбцы в этой же строке значения List'a своего ключа ... Спасибо
Миниатюры
Как Dictionary<string, List<string>> поместить в DataGrid ?  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.08.2015, 21:33
Ответы с готовыми решениями:

Привязать List<string> к Datagrid
public PW(Menu.data data) { InitializeComponent(); this.data = data; ...

Как правильно забиндить List<string> к ComboBox
есть класс Clfs, в котором есть private List&lt;string&gt; _listProjectName = new List&lt;string&gt;(); public List&lt;string&gt;...

Как передать в ConverterParameter List<string> являющийся свойством окна
В listview хочу перекрашивать строки в зависимости находится ли элемент в List&lt;string&gt; или нет. Написал конвертер но не знаю как...

10
Заблокирован
28.08.2015, 23:58
Student_Vova, вы уверены, что тут лучше всего подойдет DataGrid?
Не проще (а на мой взгляд, даже визуально лучше) использовать связкуComboBox + ListBox или ListBox + ListBox,...
В первом ключи, при выборе одного из них во втором отображается сам список.
0
3 / 3 / 2
Регистрация: 20.12.2014
Сообщений: 54
29.08.2015, 00:08  [ТС]
Нет, конечно не уверен, мне главное чтобы мой словарь как то отображался похоже на таблицу, с описанным мною функционалом, добавления удаления и изменения, может и не DataGrid использовать, а что то другое, тогда, если не сложно покажите как конкретно, а словарь Dictionary<string, List<string>> у меня железно есть. ... наверное надо было по другому спросить как отобразить мой словарь во что то похожее на таблицу ? мне вариант с ListBox + ListBox нравится, как туда словарь растащить ? удалять и добавлять новые значения смогу?
0
3 / 3 / 2
Регистрация: 20.12.2014
Сообщений: 54
30.08.2015, 23:25  [ТС]
ответа не будет?
0
Заблокирован
30.08.2015, 23:34
Цитата Сообщение от Student_Vova Посмотреть сообщение
ответа не будет?
Student_Vova, будет - завтра набросаю пример, если никто не опередит.
Но советую посмотреть в книге Мэтью Макдональд "WPF: Windows Presentation Foundation"

Не по теме:

Если отвечаете на какое-то сообщение, то нажимайте на ник - тогда придет уведомление

1
3 / 3 / 2
Регистрация: 20.12.2014
Сообщений: 54
30.08.2015, 23:46  [ТС]
Ev_Hyper, спасибо подожду, книга для какой платформы? без разницы? 3.0 пойдет?
0
Жуткая тВарЬ
394 / 329 / 135
Регистрация: 06.02.2015
Сообщений: 962
Записей в блоге: 1
31.08.2015, 08:39
Вопрос то скучный, по этому ни ктои не торопится давать олвет. В WPF обычно, как хотят так и отображают данные, чем больше хочушка, тем сложнее шаблон. В вашем случае все очень просто, на уровне начинающего и т.к. подобных вопросов на форуме и в интернете тьма тьмущая будем ждать пример Ev_Hyper
1
Заблокирован
31.08.2015, 13:51
Лучший ответ Сообщение было отмечено Student_Vova как решение

Решение

Student_Vova, самый простой пример отображения:
XML
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
   <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*"></RowDefinition>
                <RowDefinition Height="Auto"></RowDefinition>
            </Grid.RowDefinitions>
 
            <ListBox Name="lstKey" Margin="5" DisplayMemberPath="Key"> </ListBox>
            
            <StackPanel Grid.Row="1" HorizontalAlignment="Right" Orientation="Horizontal" Margin="5,2,5,10">
                <Button Margin="10,0,0,0"  Padding="2" Click="cmdGetElements_Click">Get Elements</Button>
            </StackPanel>
        </Grid>
 
        <GridSplitter Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Bottom" ResizeBehavior="PreviousAndNext" Height="5">
        </GridSplitter>
        <Grid Grid.Row="2" >
            <ListBox Name="lstValues" Margin="5" ItemsSource="{Binding ElementName=lstKey, Path=SelectedItem.Value}">
            </ListBox>
        </Grid>
    </Grid>
Пример заполнения:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public Dictionary<string, List<string>> dct { get; set; }
        
 
        public MainWindow()
        {
            InitializeComponent();
            dct = new Dictionary<string, List<string>>();
 
        }
 
        private void cmdGetElements_Click(object sender, RoutedEventArgs e)
        {
            var xd = XDocument.Load("https://pogoda.yandex.ru/static/cities.xml");
            foreach (var x in xd.Root.Elements())
                dct.Add((string)x.Attribute("name"),
                    x.Elements("city").Select(y => (string)y).ToList());
 
            lstKey.ItemsSource = dct;
        }
Вид окна:


Дальше вам нужно определиться как именно будет происходить редактирование/удаление. Есть несколько вариантов:
1. Изменять данные в отдельном окне, оставив это только для отображения
2. Изменять данные в этом окне, но тогда нужно будет изменить шаблон ячеек в ListBox-ах, чтобы их можно было редактировать. И не забыть реализовать обновление отображения при удалении элементов.
...
1
Жуткая тВарЬ
394 / 329 / 135
Регистрация: 06.02.2015
Сообщений: 962
Записей в блоге: 1
31.08.2015, 14:34
Лучший ответ Сообщение было отмечено Student_Vova как решение

Решение

Ээээээ... ладно оставлю свой вариант (посложней)

Заполнение словаря для наглядности...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public partial class MainWindow : Window
    {
        public Dictionary<string, List<string>> MyProperty { get; set; }
        public MainWindow()
        {
            MyProperty = new Dictionary<string, List<string>>();
 
            for (int i = 0; i < 15; i++)
            {
                var list = new List<string>();
 
                for (int j = 0; j < new Random(DateTime.Now.Millisecond).Next(5,25); j++)
                {
                    list.Add("specsial item " + (DateTime.Now.Millisecond));
                    Thread.Sleep(1);
                }
 
                MyProperty.Add("item " + i + 1, list);
            }
 
            InitializeComponent();
        }
    }

А вот и жуть шаблонная ни черта не понятная новичкам но учеба и труд все перетрут "в порошок"
Кликните здесь для просмотра всего текста
XML
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
<DataGrid ItemsSource="{Binding MyProperty, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MainWindow}}}" AutoGenerateColumns="False" HorizontalScrollBarVisibility="Disabled">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Ключ словаря" Width="175" Binding="{Binding Key}"/>
                        <DataGridTemplateColumn Header="Значения" Width="*">
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <ListBox ItemsSource="{Binding Value}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" HorizontalContentAlignment="Stretch">
                                        <ListBox.ItemsPanel>
                                            <ItemsPanelTemplate>
                                                <WrapPanel IsItemsHost="True"/>
                                            </ItemsPanelTemplate>
                                        </ListBox.ItemsPanel>
                                        <ListBox.ItemTemplate>
                                            <DataTemplate>
                                                <Border BorderBrush="Gray" BorderThickness="1" SnapsToDevicePixels="True" CornerRadius="3" Padding="3" Margin="3">
                                                    <TextBlock Text="{Binding}"/>
                                                </Border>
                                            </DataTemplate>
                                        </ListBox.ItemTemplate>
                                    </ListBox>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>
                        
                    </DataGrid.Columns>
                </DataGrid>




XML
1
2
3
4
<Window
       .....
    xmlns:local="clr-namespace:MyNameSpace.MainWindow"
        ....>
3
3 / 3 / 2
Регистрация: 20.12.2014
Сообщений: 54
31.08.2015, 22:07  [ТС]
amarf, Ev_Hyper, Спасибо ВАМ огромное!, разобрался, сделал два листа, добавление и удаление сделал по кнопкам, удаляю по выделенному item в ListBox, добавляю тоже по кнопке новое значение ввожу в этом же окне в TextBox, выбор key в одном листе, по выбранному key в другом показываю values. уверен, что кодом ВАС не удивишь, по этому на словах. Да, я действительно начинающий. Славо Богу , что есть этот форум, где можно у ВАС профи спросить, еще раз спасибо.

Добавлено через 13 минут
правда, если честно не понял хитрую привязку от amarf ), особенно зачем надо
Цитата Сообщение от amarf Посмотреть сообщение
Код XMLВыделить код
1
2
3
4
<Window
* * * .....
* *xmlns:local="clr-namespace:MyNameSpace.MainWindow"
* * * *....>
1
Жуткая тВарЬ
394 / 329 / 135
Регистрация: 06.02.2015
Сообщений: 962
Записей в блоге: 1
31.08.2015, 23:37
Student_Vova, не если не поняли, значит есть куда стремиться, оставлю Вам этот вопрос на самообучение.

П.С. Весь xaml тоже код и в нем также есть пространства имён и пользовательские классы
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.08.2015, 23:37
Помогаю со студенческими работами здесь

Как добавить в коллекцию List<string> из ListBox несколько элементов
Как добавить в коллекцию List из ListBox несколько слов в том случае если вхождения строки содержатся в одной из строк ListBoxa. Т.е....

Биндинг Dictionary<string, float> к одному из столбцов ListView
Добрый день. Есть ListView с несколькими столбцами (GridViewColumn). Например: &lt;GridViewColumn Header=&quot;Название события&quot;...

Как для Combobox, который сделан в UserControl, установить источник привязки List<string>
Здравствуйте. Подскажите пожалуйста такую вещь. Я сделал Combobox в UserControl. Затем я программно создаю экземпляр этого UserControl и...

List<string[]>
Здравствуйте, есть list&lt;string&gt;. в Каждый массив заноситься: id, name. List биндиться к ListBox. Как мне в view box вывести только name?...

Из RichTextBox в List<string> и наоборот
Хотел программку переписать под WPF, но оказалось что это не так просто)) Для получения данных из RichTextBox в...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru