18

我正在使用这个片段来分析我在数据网格上选择的行。

for (int i = 0; i < dgDetalle.Items.Count; i++)
{
    DataGridRow row = (DataGridRow)dgDetalle.ItemContainerGenerator.ContainerFromIndex(i);
    FrameworkElement cellContent = dgDetalle.Columns[0].GetCellContent(row);
    // ... code ...
}

循环运行平稳,但是在处理某些索引时,第二行抛出了一个空异常。MSDN 的文档说,ItemContainerGenerator.ContainerFromIndex(i)如果“如果未实现该项目”,它将返回 null,但这并不能帮助我猜测如何获得所需的值。

如何扫描所有行?还有其他方法吗?

更新

我正在使用此代码段来阅读此处CheckBox解释的内容。所以除非我改变很多东西,否则我不能使用绑定或根本无法使用。而我不能。我正在做代码维护。ItemSource

4

5 回答 5

21

试试这个,

DataGridRow row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index);
        if (row == null)
        {
                          grid.UpdateLayout();
            grid.ScrollIntoView(grid.Items[index]);
            row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index);
        }
于 2015-01-06T05:32:58.760 回答
11

DataGrid是虚拟化项目,相应的行(即容器)仅在行在视图中时创建。

您可以关闭虚拟化(如果您有很多项目,这会使第一次加载非常慢,内存使用率也会更高),或者您只需遍历数据并检查应该绑定的数据对象属性的值到数据网格。通常你根本不需要 UI 元素......

于 2012-05-14T21:41:04.480 回答
3

使用此订阅:

TheListBox.ItemContainerGenerator.StatusChanged += (sender, e) =>
{
  TheListBox.Dispatcher.Invoke(() =>
  {
     var TheOne = TheListBox.ItemContainerGenerator.ContainerFromIndex(0) as ListBoxItem;
       if (TheOne != null)
         // Use The One
  });
};
于 2014-04-26T13:14:24.787 回答
0

除了其他答案:控件类(页面/窗口/等)的构造函数中没有可用的项目。

如果要在创建后访问它们,请使用Loaded事件:

public partial class MyUserControl : UserControl
{
    public MyUserControl(int[] values)
    {
        InitializeComponent();

        this.MyItemsControl.ItemsSource = values;

        Loaded += (s, e) =>
        {
            for (int i = 0; i < this.MyItemsControl.Items.Count; ++i)
            {
                // this.MyItemsControl.ItemContainerGenerator.ContainerFromIndex(i)
            }
        };
    }
}
于 2020-05-03T01:27:57.037 回答
0

在我的情况下grid.UpdateLayout();没有帮助我需要一个DoEvents()代替:

    DataGridRow row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index);

    if (row == null)
    {

        WPFTools.DoEvents();

        grid.ScrollIntoView(grid.Items[index]);
        row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index);
    }


    /// <summary>
    /// WPF DoEvents
    /// Source: https://stackoverflow.com/a/11899439/1574221
    /// </summary>
    public static void DoEvents()
    {
        var frame = new DispatcherFrame();

        Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background,
            new DispatcherOperationCallback(
                delegate (object f)
                {
                    ((DispatcherFrame)f).Continue = false;
                    return null;
                }), frame);

        Dispatcher.PushFrame(frame);
    }
于 2020-11-19T14:37:36.117 回答