1

我有一个用户可以添加记录的数据网格。如果某个项目已经存在,我想滚动到相关行并突出显示它。

我找不到如何枚举数据网格中的行,我知道如何在可观察集合中找到项目,但找不到如何找到相关行。

另外,欢迎高亮提示,我还没有做过动画。

4

1 回答 1

1

我创建了一个示例应用程序来检查数据网格中是否已经存在新添加的项目。如果存在,则选择它并滚动查看该行。我没有写数据网格中不存在新添加项目的情况。

<my:DataGrid x:Name="PersonsDataGrid" AutoGenerateColumns="False" Loaded="PersonsDataGrid_Loaded" LoadingRow="PersonsDataGrid_LoadingRow">
  <my:DataGrid.Columns>
    <my:DataGridTextColumn Binding="{Binding FirstName}"  Header="First Name"/>
    <my:DataGridTextColumn Binding="{Binding LastName}" Header="Last Name"/>
  </my:DataGrid.Columns>

</my:DataGrid>  

namespace DataGridDemo  
{  
 public partial class MainPage : UserControl  
  {  

 private int selectedIndex = 0;
 private DataGridRow selectedRow = null;
    public MainPage()  
    {  
  InitializeComponent();  
  Persons = new List<Person>();

  Persons.Add(new Person(){FirstName = "Tony1", LastName = "Smith"});
  Persons.Add(new Person() { FirstName = "Jennifer1", LastName = "Suze" });

  Persons.Add(new Person() { FirstName = "Tony2", LastName = "Smith" });
  Persons.Add(new Person() { FirstName = "Jennifer2", LastName = "Suze" });

  Persons.Add(new Person() { FirstName = "Tony3", LastName = "Smith" });
  Persons.Add(new Person() { FirstName = "Jennifer3", LastName = "Suze" });

  Persons.Add(new Person() { FirstName = "Tony4", LastName = "Smith" });
  Persons.Add(new Person() { FirstName = "Jennifer4", LastName = "Suze" });

  Persons.Add(new Person() { FirstName = "Tony5", LastName = "Smith" });
  Persons.Add(new Person() { FirstName = "Jennifer5", LastName = "Suze" });

  Persons.Add(new Person() { FirstName = "Tony6", LastName = "Smith" });
  Persons.Add(new Person() { FirstName = "Jennifer6", LastName = "Suze" });

  Persons.Add(new Person() { FirstName = "Tony7", LastName = "Smith" });
  Persons.Add(new Person() { FirstName = "Jennifer7", LastName = "Suze" });

  Persons.Add(new Person() { FirstName = "Tony8", LastName = "Smith" });
  Persons.Add(new Person() { FirstName = "Jennifer8", LastName = "Suze" });

  Persons.Add(new Person() { FirstName = "Tony9", LastName = "Smith" });
  Persons.Add(new Person() { FirstName = "Jennifer9", LastName = "Suze" });

  Persons.Add(new Person() { FirstName = "Tony10", LastName = "Smith" });
  Persons.Add(new Person() { FirstName = "Jennifer10", LastName = "Suze" });

  Persons.Add(new Person() { FirstName = "Tony11", LastName = "Smith" });
  Persons.Add(new Person() { FirstName = "Jennifer11", LastName = "Suze" });

  PersonsDataGrid.ItemsSource = Persons;
}


private void PersonsDataGrid_Loaded(object sender, RoutedEventArgs e)
{
  Person newPerson = new Person() { FirstName = "Tony10", LastName = "Smith" };

  Person p = (from item in Persons
              where item.FirstName == newPerson.FirstName && item.LastName==newPerson.LastName
              select item).FirstOrDefault();


  if(p!=null)
  {
    selectedIndex = Persons.IndexOf(p);

    if (selectedIndex >= 0)
    {
      //PersonsDataGrid.SelectedIndex = selectedIndex ; - sometimes if selecteditem doesnot work
      PersonsDataGrid.SelectedItem = p;
      PersonsDataGrid.Dispatcher.BeginInvoke(() =>
                                               {
                                                 PersonsDataGrid.ScrollIntoView(p,null);
                                               });
    }
  }

}

 private void PersonsDataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
{
  DataGridRow row = e.Row as DataGridRow;

  if (row.GetIndex() == selectedIndex)
  {
    selectedRow = row;
  }

}


public List<Person> Persons { get; set; }
}

public class Person  
{

public string FirstName { get; set; }

public string LastName { get; set; }


} 

}
于 2012-07-19T23:36:20.503 回答