#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. Ожидаемый тип — изображение «.