【问题标题】:WPF Datagrid sort index issueWPF Datagrid排序索引问题
【发布时间】:2011-05-05 19:08:41
【问题描述】:

我似乎无法理解这一点。

我已经创建了示例代码来演示我的问题,希望有人可以指导我找到答案...

问题是数据网格排序后,标记的 ID 和名称不再与选定的数据网格项匹配。

感谢您的帮助...

谢谢

杰夫

<Window x:Class="dgSortTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="dgSortTest" Height="253" Width="403" IsEnabled="True">
    <Grid>
        <DataGrid AutoGenerateColumns="False" Height="212" HorizontalAlignment="Left" Margin="12,2,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="200" SelectionChanged="dataGrid1_SelectionChanged" RowHeaderWidth="0" AreRowDetailsFrozen="False" CanUserAddRows="True" CanUserDeleteRows="True" IsReadOnly="True">
            <DataGrid.Columns>
                <DataGridTextColumn Header="ID" Binding="{Binding ID}"/>
                <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
        </DataGrid.Columns>
        </DataGrid>
        <Label Content="Index: " Name="lblIndex" Height="28" HorizontalAlignment="Left" Margin="228,12,0,0" VerticalAlignment="Top" Width="92" />
        <Label Content="ID:" Name="lblID" Height="28" HorizontalAlignment="Left" Margin="228,46,0,0" VerticalAlignment="Top" Width="141" IsEnabled="True" />
        <Label Content="Name: " Name="lblName" Height="28" HorizontalAlignment="Left" Margin="228,80,0,0" VerticalAlignment="Top" Width="141" />
    </Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace dgSortTest
{
    public partial class MainWindow : Window
    {
       List<Person> people = new List<Person>();
       public MainWindow()
        {
            InitializeComponent();
            people.Add(new Person() { ID = 0, Name = "Jeff" });
            people.Add(new Person() { ID = 1, Name = "Tom" });
            people.Add(new Person() { ID = 2, Name = "Andy" });
            people.Add(new Person() { ID = 3, Name = "Ken" });
            people.Add(new Person() { ID = 4, Name = "Zack" });
            people.Add(new Person() { ID = 5, Name = "Emily" });
            people.Add(new Person() { ID = 6, Name = "Courtney" });
            people.Add(new Person() { ID = 7, Name = "Adam" });
            people.Add(new Person() { ID = 8, Name = "Brenda" });
            people.Add(new Person() { ID = 9, Name = "Bill" });
            people.Add(new Person() { ID = 10, Name = "Joan" });
            dataGrid1.ItemsSource = from Person in people select Person;
        }

        private void dataGrid1_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            int index = dataGrid1.SelectedIndex;
            lblIndex.Content = "Index: " + index.ToString();
            lblID.Content = "ID: " + people[index].ID;
            lblName.Content = "Name: " + people[index].Name;
        } 
    }

    public class Person
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }
}

【问题讨论】:

    标签: c# wpf sorting datagrid indexing


    【解决方案1】:

    很好地描述了您的问题和简短的示例,为此 +1。

    简短的回答,为了不改变你当前的大部分实现,你可以这样做。

    private void dataGrid1_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        Person selectedItem = dataGrid1.SelectedItem as Person;
        int index = dataGrid1.SelectedIndex;
        lblIndex.Content = "Index: " + index.ToString();
        lblID.Content = "ID: " + selectedItem.ID;
        lblName.Content = "Name: " + selectedItem.Name;
    }
    

    但是,我建议您改为直接绑定到 SelectedItem。那么你就不需要 EventHandler 后面的代码了。

    <StackPanel Orientation="Vertical" Margin="228,12,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="92" >
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="Index: "/>
            <TextBlock Text="{Binding ElementName=dataGrid1, Path=SelectedIndex}"/>
        </StackPanel>
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="ID: "/>
            <TextBlock Text="{Binding ElementName=dataGrid1, Path=SelectedItem.ID}"/>
        </StackPanel>
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="Name: "/>
            <TextBlock Text="{Binding ElementName=dataGrid1, Path=SelectedItem.Name}"/>
        </StackPanel>
    </StackPanel>
    

    【讨论】:

    • 非常感谢!我必须说第一个建议更容易理解,作为 TBO,我还不明白 xaml 发生了什么。我可以用它创建 UI,但是在没有代码的情况下在那里进行大部分编码,这让我感到困惑。我相信随着时间的推移,我会明白的。
    猜你喜欢
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    • 2018-05-27
    • 2013-04-21
    相关资源
    最近更新 更多