在所有DataGrid ItemSource循环期间获取行索引

时间:2018-08-18 05:28:49

标签: c# wpf datagrid

我想获取特定DataGrid项目的行索引或项目索引。我已经通过itemsource从循环中获取所有项目,

foreach (Item item in Datagrid.ItemsSource)
                {
                    if (item.Code != null)
                    {
                        if (code == item.Code)
                        {
                            MessageBox.Show("equal");
                        }
                    }
                }

在上面的代码中,如果code==item.code出现了消息,我已经应用了一些条件。在这种情况下,我也想获取该项目索引或行索引。如何获得。

注意:我有一个想法在Datagrid itemsource加载时执行此操作,还将Datagrid的索引与Item对象绑定并在需要时获取。但是逻辑似乎很复杂。有没有最简单的解决方案?

Datagrid:

<DataGridTextColumn Header="Code" Width="1*" Binding="{Binding Code, Mode=TwoWay}"/>

以此加载Datagrid项目,

void AddValues()
    {
        Datagrid.ItemsSource = null;
        List<Item> list = new List<Item>();
        list.Clear();

        for(int i = 0; i<30; i++)
        {
            string number = i.ToString();
            Item item = new Item()
            {
                Code = "1",
            };
            list.Add(item);
        }
        Datagrid.ItemsSource = list;
    }

1 个答案:

答案 0 :(得分:1)

要求LINQ对不匹配的行进行计数,这等于第一个匹配项的从零开始的索引。

var index = Datagrid.ItemsSource.Cast<Item>()
    .TakeWhile
    ( 
        item => item.Code != code 
    )
    .Count();

为使代码清晰起见,您可能希望将其放在扩展方法中:

public static class ExtensionMethods
{
    static public int IndexOf<T>(this IEnumerable<T> source, Func<T,bool> func)
    {
        return source.TakeWhile( item => !func(item) ).Count();
    }
{

var index = DataGrid.ItemsSource.Cast<Item>().IndexOf( i => i.Code == code );