WPF中DataGrid得到其中一行的值


之前做項目中遇到使用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>
        /// 得到DataGrid的一個單元格
        /// </summary>
        /// <param name="rowIndex">行索引</param>
        /// <param name="cellIndex">列索引</param>
        /// <returns></returns>
        private DataGridCell GetDataGridCell(int rowIndex, int cellIndex)
        {
            DataGridRow row = (DataGridRow)dgList.ItemContainerGenerator.ContainerFromIndex(rowIndex);
            dgList.UpdateLayout();
            row = (DataGridRow)dgList.ItemContainerGenerator.ContainerFromIndex(rowIndex);
            DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(row);
            DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(cellIndex);
            dgList.ScrollIntoView(row, dgList.Columns[cellIndex]);
            cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(cellIndex);

            return cell;
        }

        /// <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();
        } 

  

 

沒有修改之前的數據:

修改之后的數據:

附上源碼:http://files.cnblogs.com/zy654781296/CheckGridCell.rar


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM