Не удается добавить изображение в таблицу данных в WPF

#c# #wpf #datatable

#c# #wpf #datatable

Вопрос:

Я столкнулся со своеобразной проблемой, в которой я хочу добавить изображение, которое есть в моей Resources папке в моем WPF решении. Я получаю путь к изображению вместо имени изображения (../../Resources/Excel.png) . Я перепробовал так много вещей, таких как преобразование image в Byte[] , но, похоже, это не работает. Вот мой код.

  public DataTable BDU_DtmDcmDfmSelect(string Tablename)
        {


            DataTable tableData = new DataTable();
            tableData = dal.DAL_BDU_DtmDcmDfmSelect(Tablename);

            // All filter column in list
            List<String> FilterColumns = new List<string>();
            FilterColumns.Add("INS_DTE"); FilterColumns.Add("UPDD_DTE");
            FilterColumns.Add("DEL_DTE"); FilterColumns.Add("INSD_BY");
            FilterColumns.Add("UPDD_BY"); FilterColumns.Add("DELD_BY");

            // Reading all table column to a list as can not run loop when removing
            List<String> TableColumns = new List<string>();
            foreach (var text in tableData.Columns)
            {
                TableColumns.Add(text.ToString());
            }

            // Running loop by comparing the both the column to avoid exception
            foreach (string tablecol in TableColumns)
            {
                foreach (string filtercol in FilterColumns)
                {
                    if (tablecol == filtercol)
                    {
                        tableData.Columns.Remove(filtercol);
                    }
                }

            }

            //tableData.Columns.Add("Edit", typeof(bool)) ;
            //tableData.Columns.Add("Delete" ,typeof(bool));

            //DataColumn workCol = tableData.Columns.Add("CustID", typeof(int));

            //for (int i = 0; i < tableData.Columns.Count; i  )
            //{
            //    if (i == (tableData.Columns.Count-1))
            //    {
            //        for (int j = 0; j < tableData.Rows.Count; j  )
            //        {
            //            tableData.Rows[j][i] = 5;
            //        }

            //    }
            //}


            tableData.Columns.Add("EditImage", typeof(BitmapImage));

             BitmapImage image = new BitmapImage(new Uri("../../Resources/Excel.png", UriKind.RelativeOrAbsolute));

            // ;
           /// Image img = new Image();

            //img.Source = @"../../Resources/Excel.png";
            for (int i = 0; i < tableData.Columns.Count; i  )
            {
                if (i == (tableData.Columns.Count - 1))
                {
                    for (int j = 0; j < tableData.Rows.Count; j  )
                    {
                         tableData.Rows[j][i] = image;
                    }

                }
            }

            tableData.Columns.Add("EditImage1", typeof(Image));

            Button btn = new Button();

            btn.Content = "Edit";
            btn.Background = new SolidColorBrush(Color.FromArgb(200, 233, 222, 100));

            for (int i = 0; i < tableData.Columns.Count; i  )
            {
                if (i == (tableData.Columns.Count - 1))
                {
                    for (int j = 0; j < tableData.Rows.Count; j  )
                    {
                        tableData.Rows[j][i] = btn;
                    }

                }
            }


            //DataColumn imagecol = new DataColumn();
            //tableData.Columns.Add(imagecol);
            //DataColumn imagecol1 = new DataColumn();
            //imagecol1.DataType = System.Type.GetType("System.Byte[]");




            return tableData;
        }
 

Был вызван вышеупомянутый метод, и выходные данные были назначены GridView

  public void displayTableData(String TableName)
        {

            var TableName1 = CmbMasterTable.SelectedItem.ToString();
            var Tablename2 = CmbMasterTable.SelectedValue.ToString();
            var Tablename3 = CmbMasterTable.SelectionBoxItem.ToString();
            if (!string.IsNullOrEmpty(TableName))
            {
                DisplayGrid.ItemsSource = dcobj.BDU_DtmDcmDfmSelect(TableName).DefaultView;
            }

            if (!string.IsNullOrEmpty(TableName1))
            {
                DisplayGrid.ItemsSource = dcobj.BDU_DtmDcmDfmSelect(TableName1).DefaultView;
            }
        } 
 

Конкретный XAML будет

  <DataGrid x:Name="DisplayGrid" Grid.Row ="1" >

                    </DataGrid>
 

Пожалуйста, помогите.

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

1. Вы добавляете кнопку в таблицу данных, а не изображение: tableData. Столбцы. Add(«EditImage1», typeof(кнопка)); Итак, вы хотите отобразить изображение или сохранить только изображение?

2. @jdweng нет, на самом деле это первое. Пожалуйста, проверьте код над этой строкой

3. Где вы собираетесь отображать изображение?

4. @mm8 tableData. Столбцы. Add(«EditImage», typeof(BitmapImage));

5. @mm8 позже назначается для просмотра сетки. Позвольте мне поделиться скриншотом

Ответ №1:

A DataGrid не знает, как отобразить a DataColumn с помощью типа Image . Для его отображения необходимо использовать конвертер или шаблон:

 DisplayGrid.AutoGeneratingColumn  = (s, e) =>
{
    const string Xaml = "<DataTemplate xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"><ContentControl Content="{{Binding {0}}}" /></DataTemplate>";
    if (e.PropertyType == typeof(Image))
    {
        DataGridTemplateColumn tc = new DataGridTemplateColumn();
        tc.CellTemplate = System.Windows.Markup.XamlReader.Parse(string.Format(Xaml, e.PropertyName)) as DataTemplate;
        e.Column = tc;
    }
};
 

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

1. куда я должен добавить этот фрагмент?

2. В коде представления, в котором DataGrid определено.

3. Нужно ли мне что-то еще менять? Например, изменить тип столбца с BitmapImage на Image?

4. Да, ColumnType должно быть Image , и значение должно быть установлено Image , чтобы мой пример кода работал должным образом.

5. получено сообщение об ошибке «Тип значения не соответствует типу столбца Не удалось сохранить <../../Resources/Excel.png> в столбце EditImage. Ожидаемый тип — изображение «.