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;
}
}
}
wpf dataGrid 获取单元格,并对单元格中的对象操作的更多相关文章
- WPF DataGrid 获取选中 一行 或者 多行
WPF中DataGrid使用时,需要将其SelectedItem转换成DataRowView进行操作 然而SelectedItem 与SelectedItems DataGrid的SelectionU ...
- c# WPF DataGrid 获取选中单元格信息
private void Dg_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e) { Console.Write ...
- WPF DataGrid 获取当前行某列值
[0]是指当前行第1列的单元格位置 注意:DataRowView要求必须引用System.Data命名空间 方法一: DataRowView mySelectedElement = (DataRowV ...
- WPF DataGrid获取选择行的数据
在WPF中,单击DataGrid,如何获取当前点击的行? 比如在MouseDoubleClick事件中,事实上获取的选中行是一个DataRowview,你可以通过以下的方法来获取选中行的数据,需要引用 ...
- WPF datagrid 获取行或单格为NULL 问题
datagrid 属性 EnableRowVirtualization 设置为 false 解决...不要问我为什么. 害死我了
- 【转】WPF DataGrid 获取选中的当前行某列值
方法一:DataRowView mySelectedElement = (DataRowView)dataGrid1.SelectedItem; string result = mySelectedE ...
- WPF DataGrid 获取选中的当前行某列值
方法一: DataRowView mySelectedElement = (DataRowView)dataGrid1.SelectedItem; ]ToString(); 方法二: var a = ...
- wpf 前台获取资源文件路径问题
1 <ImageBrush ImageSource="YT.CM.CommonUI;component/Resource/FloadwindowImage/middle.png&quo ...
- 获取wpf datagrid当前被编辑单元格的内容
原文 获取wpf datagrid当前被编辑单元格的内容 确认修改单元个的值, 使用到datagrid的两个事件 开始编辑事件 BeginningEdit="dataGrid_Beginni ...
- WPF:获取DataGrid控件单元格DataGridCell
转载:http://blog.csdn.net/jhqin/article/details/7645357 /* ------------------------------------------- ...
随机推荐
- Windows 注册表是什么
注册表的概念 历史发展 在 Windows 3.x 操作系统中,注册表是一个极小文件,其文件名为 Reg.dat,里面只存放了某些文件类型的应用程序关联,大部分的设置是被放在 win.ini.syst ...
- 模拟浏览器与服务器交互(简易TomCat框架)
模拟浏览器发送请求到服务器获取资源的思想和代码实现 浏览器发送请求到服务器获取资源的流程和概念 日常我们使用的浏览器,底层都是帮我们做了很多事情,我们只需要用,比如输入www.baidu.com,就可 ...
- PYTHON编写程序练习-打印99乘法表
使用for循环嵌套的知识点编写 for i in range(1,10): #第一层循环,循环乘数 for j in range(1,i+1): #第二层循环,循环被乘数 print(f&qu ...
- LeetCode-1001 网格照明
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/grid-illumination 题目描述 在大小为 n x n 的网格 grid 上,每个单元 ...
- IntelliJ IDEA 程序运行的控制台乱码
参考:https://blog.csdn.net/zp357252539/article/details/124614007 上方导航栏"Run→Edit Configurations-&q ...
- P5318 【深基18.例3】查找文献题解(链式前向星)
P5318 [深基18.例3]查找文献题解 用head记录这一起点的最后一条边, next记录这一起点的上一条边. 注意要按照参考文献的倒叙排序(要按顺序看,而链式前向星是逆着来的,也就是为什么最简单 ...
- IT之软件公司组织架构
总结一下软件企业的组织架构,软件公司大部分都很年轻,整个行业还在调整期,一般规模都在300人以内,现在国内大型的软件产品公司都不是靠软件起家的,国内软件三强:华为.中信.海尔都是从硬件甚至是家电做起的 ...
- python 获取近几周日期
import datetimedef get_Next_day(count): today = datetime.datetime.today().date() for i in range(coun ...
- PHP压缩二进制流转CSV文件
接口返回的数据是二进制流,需先BASE64解码,再进行解压缩,压缩的文件格式为ZIP,需使用Inflater进行解压,即可得到文件. java demo: 转成PHP代码: 贴上 原始二进制流数据,需 ...
- errgroup.Group
在一组 Goroutine 中提供了同步.错误传播以及上下文取消的功能,我们可以使用如下所示的方式并行获取网页的数据: package main import ( "fmt" &q ...