Невозможно добавить изображение в DataTable в WPF - PullRequest
0 голосов
/ 18 апреля 2019

У меня возникла странная проблема, когда я хочу добавить изображение, которое находится в моей папке 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 Ответ

1 голос
/ 18 апреля 2019

A DataGrid не знает, как отобразить 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;
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...