C# DataGrid常见问题

以下是关于C#中DataGrid常见问题及解决方案的示例和说明:

DataGrid绑定数据源问题

绑定数据源时需确保数据源实现IEnumerable接口。若数据未显示,检查绑定是否正确:

csharp 复制代码
// 正确绑定示例
ObservableCollection<Person> people = new ObservableCollection<Person>();
dataGrid.ItemsSource = people; 

// 动态更新需使用ObservableCollection
people.Add(new Person { Name = "John", Age = 30 });

列定义与自动生成列

关闭自动生成列可自定义列显示:

csharp 复制代码
dataGrid.AutoGenerateColumns = false;
dataGrid.Columns.Add(new DataGridTextColumn {
    Header = "姓名",
    Binding = new Binding("Name")
});
dataGrid.Columns.Add(new DataGridTextColumn {
    Header = "年龄",
    Binding = new Binding("Age")
});

单元格编辑验证

通过CellEditEnding事件实现验证逻辑:

csharp 复制代码
dataGrid.CellEditEnding += (sender, e) => {
    if (e.Column.Header.ToString() == "Age" && 
        !int.TryParse(((TextBox)e.EditingElement).Text, out _)) {
        MessageBox.Show("请输入有效数字");
        e.Cancel = true;
    }
};

行选择与事件处理

处理选中行变化时需注意事件触发时机:

csharp 复制代码
dataGrid.SelectionChanged += (sender, e) => {
    if (dataGrid.SelectedItem is Person selectedPerson) {
        Console.WriteLine($"选中: {selectedPerson.Name}");
    }
};

性能优化建议

大量数据时建议启用虚拟化:

XML 复制代码
<DataGrid EnableRowVirtualization="True" 
          VirtualizingPanel.IsVirtualizing="True"
          VirtualizingPanel.VirtualizationMode="Recycling"/>

样式自定义

通过样式修改单元格外观:

XML 复制代码
<DataGrid.Resources>
    <Style TargetType="DataGridCell">
        <Setter Property="Background" Value="LightYellow"/>
        <Setter Property="Foreground" Value="DarkBlue"/>
    </Style>
</DataGrid.Resources>

冻结列功能

实现水平滚动时保持指定列可见:

csharp 复制代码
dataGrid.FrozenColumnCount = 2;  // 冻结前两列

注意:实际使用时需根据具体需求调整代码,确保引入正确的命名空间(如System.Windows.Controls)。对于MVVM模式,建议通过绑定命令代替直接事件处理。