【问题标题】:Not able to add image in a DataTable in WPF无法在 WPF 的 DataTable 中添加图像
【发布时间】:2019-04-18 10:45:56
【问题描述】:

我遇到了一个特殊的问题,我想在我的WPF 解决方案中添加一个位于我的Resources 文件夹中的图像。我得到的是图像路径而不是图像名称(../../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>

请帮忙。

【问题讨论】:

  • 您正在向 DataTable 添加一个按钮而不是图像:tableData.Columns.Add("EditImage1", typeof(Button));所以你想显示图片还是只存储图片?
  • @jdweng 实际上不是第一个。请检查此行上方的代码
  • 您打算在哪里显示图像?
  • @mm8 tableData.Columns.Add("EditImage", typeof(BitmapImage));
  • @mm8 后来分配给了一个 GridView。分享一下截图

标签: c# wpf datatable


【解决方案1】:

DataGrid 不知道如何渲染类型为 ImageDataColumn。您需要使用转换器或模板才能显示它:

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;
    }
};

【讨论】:

  • 我应该在哪里添加这件作品?
  • 在定义 DataGrid 的视图的代码隐藏中。
  • 我还需要更改其他内容吗?就像将 ColumnType 从 BitmapImage 更改为 Image ?
  • 是的,ColumnType 应该是 Image 并且值应该设置为 Image,这样我的示例代码才能按预期工作。
  • 收到错误“值的类型与列类型不匹配无法在 EditImage 列中存储 <..>。预期的类型是图像。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-05
  • 1970-01-01
  • 2011-12-30
  • 2015-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多