簡體   English   中英

C#WPF-將圖像添加到數據集或數據網格-僅背后提供代碼

[英]C# WPF - Adding an image to a dataset or datagrid - code behind only

我有一個在開始時定義的數據網格

 DataGrid dtgWatch;

並鏈接到數據集dtsWatch;

dtgWatch.ItemsSource = dtsWatch.Tables[0].DefaultView;

在中間,數據集填充有

 dtsWatch.Tables[0].Rows.Add(string1, string2);

目的類似於以下選項卡:

| string1_A | string2_A |

| string1_B | string2_B |

| string1_B | string2_C |

正常工作。 現在進行更改:在該推理的一個點上(僅一行),我必須放置圖片而不是字符串。 這意味着:

| string1_A | string2_A |

| string1_B | Image2_B | <---------------

| string1_B | string2_C |

從理論上講,這應該工作(沒有編譯錯誤),以防出現圖像的情況

Image img =...
dtsWatch.Tables[0].Rows.Add(string1, img);

但結果是

| 字符串1 | System.Windows.Controls.Image |


我想到的一種可能的解決方案是將標記放在某個位置,然后在運行時(加載行事件或類似事件)更改帶有圖像的單元格的內容。 不幸的是我可以這樣做,因為我可以直接訪問和修改單元格。


我正在使用帶有appdomain tecnique的C#wpf進行所有操作。 這意味着我還沒有xaml,我必須在代碼背后做所有事情。 我所擁有的只是一個要與datagrid添加的網格。


我已經嘗試過了但是還沒有完成,我發現的所有其他解決方案都暗示着要使用xaml


謝謝你的幫助

帕特里克

為了實現所需的行為,您必須手動創建DataGridColumns。

您仍然可以編寫Xaml,因為您可以輕松地在后面的代碼中解析並創建相應的對象。 請參閱System.Windows.Markup.XamlReader.Load

所以這應該為你工作

dtgWatch.AutoGenerateColumns = false;
foreach (DataColumn column in dtsWatch.Tables[0].Columns)
{
    string dataGridTemplateColumn = $@"
    <DataGridTemplateColumn
        Header=""{column.ColumnName}""
        xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
        xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"" >
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <ContentControl Content=""{{Binding {column.ColumnName}}}"" />
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>";
    XmlReader xr = XmlReader.Create(new StringReader(dataGridTemplateColumn));
    dtgWatch.Columns.Add((DataGridTemplateColumn)System.Windows.Markup.XamlReader.Load(xr)); 
}

好的,我采用了另一種方法:

private void Dg_Loaded(object sender, RoutedEventArgs e)
{
    for (int i = 0; i < dg.Items.Count; i++)
    {
        DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(i);
        for (int j = 0; j < dg.Columns.Count; j++)
        {
            TextBlock cellContent = dg.Columns[j].GetCellContent(row) as TextBlock;
            var strContent = cellContent.Text;
            if (strContent == "BBB2")
            {
                    // This if I want merely change the value (not my case)
                    //cellContent.Text = "XXXX";

                    //This if I want to put an image
                    var dtgCell = cellContent.Parent as DataGridCell;
                    dtgCell.Content = new Image() { Source = new BitmapImage(new Uri(@"C:\Users\Pictures\Ball_Red.png")) };
                }
            }
        }
    }

因此,我嘗試在顯示之前修改dtg,然后將其更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM