如何使用该datagrid的事件访问datagrid中的文本框?

时间:2013-04-22 05:07:21

标签: wpf wpf-controls wpfdatagrid

我在数据网格中有一个使用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>

3 个答案:

答案 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
}

我知道这看起来像是一种蛮力的解决方案,而且肯定有一种更优雅的方法。但最终结果才是重要的。时间是我们维度的坐标:)