我在数据网格中有一个使用xaml设计的文本框。我是否可以使用datagrid的事件访问先前在codefile中使用xaml设计的文本框。请帮帮我.....................
<Window x:Class="GridTextBox.Test"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" WindowState="Maximized"
Title="Test" Height="300" Width="300" Loaded="Window_Loaded">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="*"/>
<RowDefinition Height="30"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width=".25*"/>
<ColumnDefinition Width=".25*"/>
<ColumnDefinition Width=".25*"/>
<ColumnDefinition Width=".25*"/>
</Grid.ColumnDefinitions>
<DataGrid Grid.Row="1" Grid.Column="1" Name="datagrid1" SelectionChanged="datagrid1_SelectionChanged" LoadingRowDetails="DataGrid_LoadingRowDetails" Height="auto" Width="auto">
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Name="txtEmpid" Text="hiiiiii"></TextBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
答案 0 :(得分:0)
首先,您需要使用ItemContainerGenerator
从数据中获取正确的行(在datagrid1_SelectionChanged事件中)。
var row = (DataGridRow)datagrid1.ItemContainerGenerator.
ContainerFromItem(datagrid1.SelectedItem);
然后像这样得到TextBlock:
var text = datagrid1.Columns[0].GetCellContent(row) as TextBlock;
答案 1 :(得分:0)
var cellInfo=dataGrid1.SelectedCells[0];
var txt=cellInfo.Column.GetCellContent(cellInfo.Item);
或者还有一个解决方案来获取所有文本框的文本,其中有动态行。
DataRowView dataRow = (DataRowView)dataGrid1.SelectedItem;
int Columnindex = datagrid1.CurrentCell.Column.DisplayIndex;
int iGridRowsCount = ArgumentsDataGridforTestcasessTab.Items.Count;
for (int jRow = 0; jRow <= iGridRowsCount - 1; jRow++)
{
DataGridCell cell = GetCell(jRow, Columnindex);
ContentPresenter _contentPresenter = new ContentPresenter();
_contentPresenter = (ContentPresenter)cell.Content;
// get the attached control from the cell
TextBox myTextBox = GetVisualChild<TextBox>(_contentPresenter);
}
答案 2 :(得分:0)
请注意该单元格是处于编辑模式还是仅处于预览模式。如果它处于编辑模式(我是说您正在写它,或者您只是写了一些东西而没有移动到其他单元格),它将不会强制转换为TextBlock,而是强制转换为Textbox。
(仅)当它处于预览模式时,它确实将转换为TextBlock。
我遇到了同样的问题,并且在将内容投射到Textbox时尝试了try-catch序列来解决了这个问题。
有类似的东西
try
{
var myTextboxVariable=(Textbox) datagridcell.Content
//extract the text out of myVariable.Text, do whatever you intend to the Textbox
}
catch(Exception ex)
{
var myTextBlockVariable=(TextBlock) datagridcell.Content
//extract the text out of myVariable.Text, do whatever you intend to the TextBlock
}
我知道这看起来像是一种蛮力的解决方案,而且肯定有一种更优雅的方法。但最终结果才是重要的。时间是我们维度的坐标:)