2016-10-13 4 views
1

У меня есть набор массивов в массиве, который содержит символы, например.
{{'#', '.', '#'} {'#', '$', '#'} {'#', '@', '#',} {'#', '# ',' # ',}}
И что я хочу, чтобы иметь возможность создавать сетку на основе количества динамически, поскольку количество может измениться (они всегда будут иметь одинаковое количество символов во всех внутренних массивах) так я хочу, чтобы внутренние массивы быть строками и символами внутри каждый будут по своему собственному колонку, так это будет выглядетьДинамически создайте сетку фотобоксов

«#. #»
«# $ #»
«# @ #»
" ### "

s o что было бы лучшим способом настроить эту сетку, а затем то, что я хотел бы сделать, это заполнить все эти ячейки с помощью ящиков с картинками, поскольку в зависимости от того, какой символ это будет, это будет конкретная картина.

так просто интересно, что лучший способ сделать это будет любая помощь/совет высоко ценится

+1

Использование 'DataGridView' это самый простой вариант , –

+0

Возможный дубликат [Как заполнить сетку WPF на основе двумерного массива] (http://stackoverflow.com/questions/276808/how-to-populate-a-wpf-grid-based-on-a- 2-мерный массив) – rmbq

ответ

1

Использование DataGridView самый простой вариант. Например:

var images = new Dictionary<char, Image>() 
{ 
    {'#', Properties.Resources.Image1}, 
    {'.', Properties.Resources.Image2}, 
    {'$', Properties.Resources.Image3}, 
    {'@', Properties.Resources.Image4}, 
}; 
var data = new List<string>() { "#.#", "#$#", "#@#", "###" }; 
var list = data.Select(x => new 
         { 
          A = images[x[0]], 
          B = images[x[1]], 
          C = images[x[2]] 
         }).ToList(); 
this.dataGridView1.DataSource = list; 

В приведенном выше коде я создал словарь для сопоставления между символами и изображениями. Затем сформируйте входные данные в список, содержащий эти изображения вместо символов. Когда вы установите список результатов как DataSource из DataGridView, вы увидите эти изображения вместо символов.


Если по какой-либо причине вы не хотите использовать анонимный объект, вы можете просто создать динамический DataTable, имеющий любое количество столбцов:

var images = new Dictionary<char, Image>() 
{ 
    {'#', Properties.Resources.Image1}, 
    {'.', Properties.Resources.Image2}, 
    {'$', Properties.Resources.Image3}, 
    {'@', Properties.Resources.Image4}, 
}; 
char[][] data = new char[][]{ 
    new char[] {'#','.','#'}, 
    new char[] {'#','$','#'}, 
    new char[] {'#','@','#'}, 
    new char[] {'#','#','#'}, 
}; 
var dt = new DataTable(); 
for (int i = 0; i < data.Max(x => x.Count()); i++) 
    dt.Columns.Add(string.Format("C{0}", i), typeof(Image)); 
data.ToList().ForEach(a => dt.Rows.Add(a.Select(x=>images[x]).ToArray())); 
this.dataGridView1.DataSource = dt; 
+0

Это хорошо работает благодаря тому, что мне пришлось немного приспосабливаться, но благодаря этой единственной проблеме, хотя это создает ряд белых ящиков с красными «X» в нижней части экрана, поэтому я думаю его в этой второй до нижней строке, где он создает от 1 до многих строк, и поэтому не нужно что-либо вставлять в ячейки, но завтра это плохо. – 1seanr

+1

Вы радушны. Установите 'this.dataGridView1.AllowUserToAddRows = false;'. –

Смежные вопросы