FindVisualChild参考问题

时间:2014-08-10 14:21:42

标签: c# wpf datagrid

我找到并修改了以下代码,以便使用iTextSharp类将我的dataGrid导出为pdf文档。

private void ExportToPdf(DataGrid grid)
    {
        PdfPTable table = new PdfPTable(grid.Columns.Count);
        using (Document doc = new Document(iTextSharp.text.PageSize.A4))
        {
            using (PdfWriter writer = PdfWriter.GetInstance(doc, new System.IO.FileStream("Test.pdf", FileMode.Create)))
            {
                doc.Open();
                for (int j = 0; j < grid.Columns.Count; j++)
                {
                    table.AddCell(new Phrase(grid.Columns[j].Header.ToString()));
                }
                table.HeaderRows = 1;
                IEnumerable itemsSource = grid.ItemsSource as IEnumerable;
                if (itemsSource != null)
                {
                    foreach (var item in itemsSource)
                    {
                        DataGridRow row = grid.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow;
                        if (row != null)
                        {
                            DataGridCellsPresenter presenter = FindVisualChild<DataGridCellsPresenter>(row);
                            for (int i = 0; i < grid.Columns.Count; ++i)
                            {
                                DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(i);
                                TextBlock txt = cell.Content as TextBlock;
                                if (txt != null)
                                {
                                    table.AddCell(new Phrase(txt.Text));
                                }
                            }
                        }
                    }
                    doc.Add(table);
                    doc.Close();
                }
            }
        }
    } 

问题出现在以下行中:

DataGridCellsPresenter presenter = FindVisualChild<DataGridCellsPresenter>(row);

Visual Studio返回以下错误&#39;名称&#39; FindVisualChild&#39;在当前的背景下不存在&#39;。如何添加此参数?

2 个答案:

答案 0 :(得分:12)

WPF框架不提供

FindVisualChild 方法,您必须添加它们。可能你想要这个:

public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj)
       where T : DependencyObject
{
    if (depObj != null)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
            if (child != null && child is T)
            {
                yield return (T)child;
            }

            foreach (T childOfChild in FindVisualChildren<T>(child))
            {
                yield return childOfChild;
            }
        }
    }
}

public static childItem FindVisualChild<childItem>(DependencyObject obj)
    where childItem : DependencyObject
{
    foreach (childItem child in FindVisualChildren<childItem>(obj))
    {
        return child;
    }

    return null;
}

在某个实用程序类中添加这些方法,以便可以重用它们。

答案 1 :(得分:2)

通常的做法是使用这些方法(由Rohit Vats发布)作为扩展方法,如下所示:

static class Utils
{

    public static IEnumerable<T> FindVisualChildren<T>(this DependencyObject depObj)
           where T : DependencyObject
    {
        ...
    }

    public static childItem FindVisualChild<childItem>(this DependencyObject obj)
        where childItem : DependencyObject
    {
        ...
    }

}

然后在你的代码中:

using Utils;

class MyCode
{
    public static DataGridCellsPresenter GetPresenter(DataGridRow row)
    {
        return row.FindVisualChild<DataGridCellsPresenter>();
    }
}