得到DataGrid的某一行列的值(转载)

本文介绍了一个使用Silverlight实现的数据网格控件示例,该控件能够动态加载数据,并通过数据绑定展示客户信息。同时,文章展示了如何为每行数据定制功能按钮,并在点击按钮时获取所选行的信息。

转载自[孟子E章]

http://blog.youkuaiyun.com/net_lover/archive/2008/11/26/3379002.aspx

 

<UserControl xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"  x:Class="SilverlightApplication8.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Width="600" Height="Auto">
    <Grid x:Name="LayoutRoot" Background="White">
        <ScrollViewer VerticalScrollBarVisibility="Auto" BorderThickness="0">
            <StackPanel Margin="10,10,10,10">
                <data:DataGrid x:Name="dataGrid1"
      Height="200" Margin="0,5,0,10"
      AutoGenerateColumns="False" LoadingRow="dataGrid1_LoadingRow">
                    <data:DataGrid.Columns>
                        <data:DataGridTextColumn  Header="序号" Width="120"  Binding="{Binding IndexName}" />
                        <data:DataGridTextColumn  Header="姓名" Width="120"  Binding="{Binding UserName}" />
                        <data:DataGridTextColumn  Header="地址" Width="120"  Binding="{Binding Address}" />
                        <data:DataGridTemplateColumn Header="功能按钮"  Width="80">
                            <data:DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <StackPanel Orientation="Horizontal">
                                        <Button Content="初始化内容" x:Name="Button1" Click="Button1_Click"  Tag=""></Button>
                                    </StackPanel>
                                </DataTemplate>
                            </data:DataGridTemplateColumn.CellTemplate>
                        </data:DataGridTemplateColumn>
                    </data:DataGrid.Columns>
                </data:DataGrid>
                <TextBlock x:Name="msg"></TextBlock>
            </StackPanel>
        </ScrollViewer>

    </Grid>
</UserControl>

 

 

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace SilverlightApplication8
{
    public partial class Page : UserControl
    {
        public Page()
        {
            InitializeComponent();
            dataGrid1.ItemsSource = Customer.GetSampleCustomerList();

        }

        private void dataGrid1_LoadingRow(object sender, DataGridRowEventArgs e)
        {
            Customer bindData = (Customer)e.Row.DataContext;
            Button btn = dataGrid1.Columns[3].GetCellContent(e.Row).FindName("Button1") as Button;
            btn.Content = bindData.UserName;
            btn.Tag = bindData.IndexName + "," + e.Row.GetIndex();
        }

        private void Button1_Click(object sender, RoutedEventArgs e)
        {
            Button b = sender as Button;
            string[] t = b.Tag.ToString().Split(',');
            msg.Text = "你选择的值是:" + t[0] + " 是 DataGrid 的第 " + t[1] + " 行";
        }
    }
    /// <summary>
    /// 数据对象
    /// </summary>
    public class Customer
    {
        public Int32 IndexName { get; set; }
        public String UserName { get; set; }
        public String Address { get; set; }

        public Customer(Int32 indexName, String userName, String address)
        {
            this.IndexName = indexName;
            this.UserName = userName;
            this.Address = address;
        }

        public static List<Customer> GetSampleCustomerList()
        {
            //示例数据
            List<Customer> data = new List<Customer>();
            for (int i = 0; i < 10; i++)
            {
                data.Add(new Customer(i * i, "孟宪会之" + i.ToString(), "地址之" + i.ToString()));
            }
            return data;
        }
    }
}

 

 

<think> 首先,用户的问题是:在WPF中如何修改DataGrid一行。用户提供了几个引用,我需要参考这些引用,但也要确保回答真实可靠。 用户提供的引用: - 引用[1]:描述了两种方法:获取和设置。设置的方法是:`(DataGridName.Columns[M].GetCellContent(DataGridName.Items[N]) as TextBlock).Text = "";` - 引用[2]:介绍了获取单元格的方法,通过DataRowView来访问。 - 引用[3]:讨论了自定义DataGrid的样式。 用户的需求是修改DataGrid中特定行和。所以,我需要提供一种可靠的方法来实现这个。 从引用中提取关键点: - 设置的方法:使用 `GetCellContent` 来获取单元格的内容控件(如TextBlock),然后设置其Text属性。 - 需要行号(N)和号(M)。 - 在引用[2]中提到了当DataGrid失去焦点时,SelectedIndex可能变为-1,所以在操作前可能需要确保行被选中或指定行号。 最佳实践: - 在WPF中,DataGrid通常绑定到数据源(如DataTable、集合等)。修改应该通过修改数据源来实现,而不是直接操作UI元素,因为这样可以保持数据绑定的一致性。 - 然而,用户明确询问如何修改DataGrid的行,可能指的是在UI层面修改,但我应该建议绑定数据源的方式。 用户的问题是基于引用的,所以我应该使用引用中提到的方法。 步骤: 1. 确保DataGrid有数据源。 2. 获取特定行和。 3. 修改。 从引用[1]:设置的方法是: `(DataGridName.Columns[M].GetCellContent(DataGridName.Items[N]) as TextBlock).Text = "新";` 注意事项: - 这个方法假设单元格内容是一个TextBlock。但在实际应用中,单元格可能包含其他类型的控件(如ComboBox、CheckBox),所以需要类型转换。 - 最好是直接修改数据源。 从引用[2]:获取是通过DataRowView:`string cellValue = (string)rowView.Row.ItemArray[8];` 类似地,修改也可以通过数据源。 建议的方法: - 如果DataGrid绑定到DataTable,可以直接修改DataRow。 - 如果绑定到ObservableCollection,可以修改对象属性。 但用户的问题是如何修改DataGrid一行,所以我需要提供UI操作方法和数据源修改方法。 结构化回答: - 介绍两种方式:通过UI元素直接修改 和 通过数据源修改。 - 强调推荐使用数据源修改,因为更符合MVVM模式。 - 提供示例代码。 系统指令要求: - 使用中文回答。 - 结构清晰。 - 生成相关问题。 - 引用的段落末尾添加引用标识。 - 数学表达式用$...$或$$...$$,但这里可能不涉及数学。 - 确保LaTeX语法正确,但这里主要是代码。 回答结构: 1. 理解需求:解释修改DataGrid的方法。 2. 提供方法: - 方法1:直接操作UI元素(基于引用[1])。 - 方法2:通过数据源修改(更推荐)。 3. 代码示例。 4. 注意事项。 5. 生成相关问题。 生成相关问题: - 类似示例,添加相关问题部分。 最终回答: - 用中文。 - 自然地添加引用标识。 </think>### WPF中修改DataGrid一行的方法 在WPF中修改DataGrid特定行和,可以通过两种主要方式实现:**直接操作UI元素**(例如单元格控件)或**修改绑定数据源**(推荐方式)。以下我将逐步解释这两种方法,并提供代码示例。核心思路是: - 确定目标行号(N)和号(M)。 - 通过DataGrid的Items或Columns属性定位到单元格。 - 更新并确保UI刷新。 我将基于您提供的引用[1]、[2]和[3],并结合WPF最佳实践进行说明。优先推荐**修改数据源**的方式,因为它更符合MVVM模式,能自动处理数据绑定和UI更新,避免直接操作UI可能引发的异常(如单元格控件类型不匹配)[^1][^2]。 --- ### 方法1:直接操作UI元素(适用于简单场景或未绑定数据源) 这种方法直接访问DataGrid的单元格控件(如TextBlock),并修改其显示文本。优点是简单直观,但缺点是: - 仅适用于单元格内容为TextBlock等简单控件的情况(如果单元格是ComboBox或CheckBox,需额外处理)。 - 不推荐在数据绑定场景中使用,因为它不会更新底层数据源,可能导致数据不一致。 **步骤和代码示例:** 1. **确定行号(N)和号(M)**:行号从0开始(例如第0行),号是的索引(例如第2索引为2)。 2. **获取单元格内容控件**:使用`GetCellContent`方法获取单元格的控件。 3. **设置**:将控件转换为TextBlock并修改Text属性。 ```csharp // 假设DataGrid名称为myDataGrid,要修改第2行(索引1)、第3(索引2)的为"新" int rowIndex = 1; // 行号N(索引从0开始) int columnIndex = 2; // 号M // 获取单元格内容控件 var cellContent = myDataGrid.Columns[columnIndex].GetCellContent(myDataGrid.Items[rowIndex]); if (cellContent is TextBlock textBlock) { textBlock.Text = "新"; // 直接设置 } else { // 如果单元格不是TextBlock(如ComboBox),需额外处理 throw new InvalidOperationException("单元格控件类型不支持直接修改"); } ``` **注意事项**: - 如果DataGrid失去焦点或未选中行,`SelectedIndex`可能为-1,需先设置默认行(如引用[2]所示)[^2]。 - 在单元格样式自定义时(如引用[3]),确保控件类型匹配,避免转换错误。 --- ### 方法2:通过修改数据源(推荐,适用于数据绑定场景) 这是最佳实践,尤其当DataGrid绑定到数据源(如DataTable或ObservableCollection)时。修改数据源后,WPF自动更新UI。优点包括: - 支持数据绑定和通知机制(如INotifyPropertyChanged)。 - 适用于复杂控件(如ComboBox)。 - 避免直接操作UI的维护问题。 **步骤和代码示例:** 1. **绑定数据源**:确保DataGrid的ItemsSource绑定到数据集合(如DataTable或对象表)。 2. **获取数据项**:通过行号获取数据对象(如DataRowView或自定义对象)。 3. **修改属性**:直接更新数据对象的属性。 4. **刷新UI**:如果使用ObservableCollection,修改属性会自动刷新;对于DataTable,可能需要调用`AcceptChanges`。 #### 示例1:绑定到DataTable ```csharp // 假设DataGrid名称为myDataGrid,绑定到DataTable int rowIndex = 1; // 行号N int columnIndex = 2; // 号M // 获取DataRowView(如引用[2]) if (myDataGrid.Items.Count > rowIndex) { var rowView = myDataGrid.Items[rowIndex] as DataRowView; if (rowView != null) { rowView.Row[columnIndex] = "新"; // 直接修改数据源 rowView.Row.AcceptChanges(); // 提交更改,触发UI更新 } } ``` #### 示例2:绑定到ObservableCollection(自定义对象) ```csharp // 假设绑定到ObservableCollection<Person>,Person类有Name属性(对应) public class Person : INotifyPropertyChanged { private string _name; public string Name { get { return _name; } set { _name = value; OnPropertyChanged(nameof(Name)); // 实现INotifyPropertyChanged } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } // 修改代码 int rowIndex = 1; var person = myDataGrid.Items[rowIndex] as Person; if (person != null) { person.Name = "新"; // 修改属性,UI自动更新 } ``` **注意事项**: - 确保数据源支持属性更改通知(如INotifyPropertyChanged),否则UI不会刷新。 - 如果行号无效(如超出范围),需添加错误处理(如try-catch)。 - 在自定义样式时(如引用[3]),样式不影响数据源修改的逻辑[^3]。 --- ### 关键注意事项 1. **行号和号的获取**: - 行号:可通过`SelectedIndex`(当前选中行)或遍历`Items`集合。 - 号:使用的索引(`Columns[索引]`)或绑定属性名(如`DataGrid.Columns[2].Binding.Path.Path`获取属性名)。 2. **性能问题**:直接操作UI在大型DataGrid中可能卡顿,优先使用数据源方式。 3. **错误处理**:始终检查索引有效性,避免`ArgumentOutOfRangeException`。 4. **MVVM推荐**:在复杂应用中,结合ViewModel修改数据,避免在代码后台直接操作UI[^1][^2]。 通过以上方法,您可以灵活修改DataGrid的单元格。如果提供更多上下文(如数据源类型),我可以优化示例。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值