现在的位置: 首页 > 综合 > 正文

WPF中DataGrid得到其中一行的值

2017年11月07日 ⁄ 综合 ⁄ 共 2350字 ⁄ 字号 评论关闭

   之前做项目中遇到使用DataGrid,对DataGrid中某一个单元格进行编辑并保存,其中在得到DataGrid某个单元格中的值遇到问题,在网上查找各种资料后终于解决问题,下面把代码贴出来和大家分享一下。

        如下图,对DataGrid中的编号和是否启用编辑后,得到单元格修改后的数据,并对修改后的数据进行保存。我刚开始的思路是:将数据源绑定到前台页面上,然后使用DataGrid自带的一个属性,将IsReadOnly属性设置为False后,就可以对页面上的数据进行编辑了,但是出现一个问题是,在得到DataGrid中某个单元格的数据时,得到的只是绑定之前的数据,得不到修改后的数据。百思不得其解,最后变换思路,首先得到DataGrid的一个单元格,由于DataGrid中的一个单元格是模板构成的,所以就要先得到这个单元格的模板。

前台XAML代码:其中编号和是否启用使用了模板

<DataGrid Name="dgList"  Margin="0,12,0,0" AutoGenerateColumns="False" IsReadOnly="True" MouseRightButtonDown="dgList_MouseRightButtonDown">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="城市" Width="150" Binding="{Binding Path=Name}"/>
                    <DataGridTemplateColumn Header="编号" Width="150" >
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Height="20" Width="120" Text="{Binding Path=No}"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTemplateColumn Header="是否启用">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox Height="20" Padding="0,3,0,0" Width="120" IsChecked="{Binding Path=IsUse}"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>

后台核心代码:

此方法是得到DataGrid单元格中的可视化子项

	public static T GetVisualChild<T>(Visual parent) where T : Visual
        {
            T childContent = default(T);
            int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
            for (int i = 0; i < numVisuals; i++)
            {
                Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
                childContent = v as T;
                if (childContent == null)
                {
                    childContent = GetVisualChild<T>(v);
                }
                if (childContent != null)
                {
                    break;
                }
            }
            return childContent;
        }

  	/// <summary>
        /// 得到TextBox里的值
        /// </summary>
        /// <param name="rowIndex">行索引</param>
        /// <param name="cellIndex">列索引</param>
        /// <returns>TextBox里的值</returns>
        private string GetTextBoxValue(int rowIndex, int cellIndex)
        {
            var obj = VisualTreeHelper.GetChild((ContentPresenter)GetDataGridCell(rowIndex, cellIndex).Content, 0);
            TextBox tbox = null;
            if (obj != null && obj.DependencyObjectType.Name == "TextBox")
            {
                tbox = (TextBox)obj;
            }
            return tbox.Text;
        }

  	 /// <summary>
        /// 得到CheckBox里的值
        /// </summary>
        /// <param name="rowIndex">行索引</param>
        /// <param name="cellIndex">列索引</param>
        /// <returns>CheckBox里的值</returns>
        private string GetCheckBoxValue(int rowIndex, int cellIndex)
        {
            var obj = VisualTreeHelper.GetChild((ContentPresenter)GetDataGridCell(rowIndex, cellIndex).Content, 0);
            CheckBox chk = null;
            if (obj != null && obj.DependencyObjectType.Name == "CheckBox")
            {
                chk = (CheckBox)obj;
            }
            return chk.IsChecked.ToString();
        } 

没有修改之前的数据:

修改之后的数据:

抱歉!评论已关闭.