2

我在使用 xaml 设计的数据网格中有一个文本框。我可以使用数据网格的事件访问以前在代码文件中在 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>

4

3 回答 3

0

首先,您需要ItemContainerGenerator习惯从数据中获取正确的行(在您的 datagrid1_SelectionChanged 事件中)。

var row = (DataGridRow)datagrid1.ItemContainerGenerator.
                     ContainerFromItem(datagrid1.SelectedItem);

然后像这样得到TextBlock:

var text = datagrid1.Columns[0].GetCellContent(row) as TextBlock;
于 2013-04-22T11:25:36.070 回答
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);                 

}
于 2013-12-16T12:14:00.630 回答
0

注意单元格是处于编辑模式,还是仅处于预览模式。如果它处于编辑模式(我的意思是你正在写入它,或者你只是写了一些东西并且没有移动到其他单元格)它不会转换为 TextBlock,而是转换为 Textbox。

当(仅)它处于预览模式时,它确实会转换为 TextBlock。

我遇到了同样的问题,并在将内容投射到文本框时通过 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
}

我知道它看起来像一个粗略的解决方案,并且必须有一个更优雅的方式。但最终重要的是结果。时间是我们维度的坐标:)

于 2018-11-28T18:50:45.530 回答