wpf dataGrid 获取单元格,并对单元格中的对象操作

先上图:

 

 要求:对第一行的“选项内容举例。。。”的控件进行隐藏,如下:

 

 

前端代码:

<Window x:Class="DataGridPractice.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:DataGridPractice"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded">
    <Grid>
        <Grid.Resources>
                       
            <DataTemplate x:Key="DateTemplate" >
                <StackPanel DataContext="{Binding choseItems}">
                    <Border Background="LightBlue">
                        <TextBox Text="{Binding ChoseName}" Cursor="Arrow" Name="R0"/>
                    </Border>
                    <Border Background="White">
                        <TextBox Text="{Binding ChoseContent}" Cursor="Arrow" Name="R1"/>
                    </Border>
                </StackPanel>
            </DataTemplate>
            
            <DataTemplate x:Key="EditingDateTemplate">
                
            </DataTemplate>
        </Grid.Resources>


        <DataGrid AutoGenerateColumns="False" Name="datagrid1">
            <DataGrid.Columns>
                <DataGridTextColumn Header="ID值"  Width="auto" Binding="{Binding questionID}" />
                <DataGridTextColumn Header="题目"  Width="auto" Binding="{Binding questionName}" />
                <DataGridTemplateColumn Header="多行" Width="*" MinWidth="25"                                         
                                        CellTemplate="{StaticResource DateTemplate}" CellEditingTemplate="{StaticResource EditingDateTemplate}" IsReadOnly="True"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

后端代码;

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
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;
using System.Windows.Threading;

namespace DataGridPractice
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        class question
        {
            //题目ID号
            public Int32 questionID { get; set; }

            //题目名,比如:第1题或第2题等
            public string questionName { get; set; }

            //某题中"选项类"的集合,比如A-D
            public ObservableCollection<choseItem> choseItems { get; set; }
            public question(Int32 _id, string _questionname, ObservableCollection <choseItem> _choseitems)//构造函数
            {
                questionID = _id;
                questionName = _questionname;
                choseItems = _choseitems;
            }
        }
        //选项类
        class choseItem
        {
                //选项名,比如:A,B,C,D之类
                public string ChoseName { get; set; }
                //选项内容
                public string ChoseContent { get; set; }
        }
        ObservableCollection <question> Questions = new ObservableCollection <question>();//题目数组

        ObservableCollection<choseItem> ChoseItems = new ObservableCollection<choseItem>();//选项数组

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            string[] CharStr = new string[4] { "A", "B", "C", "D" };
            for (int i = 0; i < 5; i++)
            {                          
                for (int j = 0; j < 4; j++)
                {
                    choseItem item = new choseItem();//选项类
                    item.ChoseName = CharStr[j] + ":";
                    item.ChoseContent = "选项内容举例...";
                    ChoseItems.Add(item);
                }
                Questions.Add(new question(i, "__第" + (i + 1).ToString() + "", ChoseItems));
            }
            datagrid1.ItemsSource = Questions;

            ShowChildCell(datagrid1, 2, 9);
        }

        public static void ShowChildCell(DataGrid datagrid, int colNum, int childCellCount = 9)
        {
            DataGridTemplateColumn templeColumn = datagrid.Columns[colNum] as DataGridTemplateColumn;
            if (templeColumn == null) return;

            DataGridCell dataGridCell = GetDataGridCell(datagrid, 0, colNum);
            DataGridCellInfo dataGridCellInfo = new DataGridCellInfo(dataGridCell);

            object item = dataGridCellInfo.Item;

            FrameworkElement element = templeColumn.GetCellContent(item);
            TextBox textBlockOther = (TextBox)templeColumn.CellTemplate.FindName("R1", element);

            textBlockOther.Visibility = Visibility.Hidden;
        }

        public static DataGridCell GetDataGridCell(DataGrid datagrid, int rowIndex, int columnIndex)
        {
            try
            {
                DataGridRow rowContainer = GetDataGridRow(datagrid, rowIndex);
                if (rowContainer != null)
                {
                    DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);
                    //这行代码是通过行得到单元格

                    DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex);
                    //这行代码是通过index得到具体的单元格

                    if (cell == null)
                    {
                        datagrid.ScrollIntoView(rowContainer, datagrid.Columns[columnIndex]);
                        cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex);
                    }
                    return cell;
                }
            }
            catch
            {
                return null;
            }
            return new DataGridCell();
        }

        public static DataGridRow GetDataGridRow(DataGrid dataGrid, int index)
        {
            if (index >= dataGrid.Items.Count)
            {
                throw new IndexOutOfRangeException(String.Format("Index {0} is out of range.", index));
            }

            DataGridRow row = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(index);
            if (row == null)
            {
                // may be virtualized, bring into view and try again
                dataGrid.ScrollIntoView(dataGrid.Items[index]);
                WaitFor(TimeSpan.Zero, DispatcherPriority.SystemIdle);
                row = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(index);
            }

            return row;
        }
        public static void WaitFor(TimeSpan time, DispatcherPriority priority)
        {
            DispatcherTimer timer = new DispatcherTimer(priority);
            timer.Tick += new EventHandler(OnDispatched);
            timer.Interval = time;
            DispatcherFrame dispatcherFrame = new DispatcherFrame(false);
            timer.Tag = dispatcherFrame;
            timer.Start();
            Dispatcher.PushFrame(dispatcherFrame);
        }
        public static void OnDispatched(object sender, EventArgs args)
        {
            DispatcherTimer timer = (DispatcherTimer)sender;
            timer.Tick -= new EventHandler(OnDispatched);
            timer.Stop();
            DispatcherFrame frame = (DispatcherFrame)timer.Tag;
            frame.Continue = false;
        }

        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;
        }
    }
}

 

posted on 2022-11-21 15:27  wu.g.q  阅读(822)  评论(0编辑  收藏  举报

导航