我是WPF的新手,但是我对.net的旧版本中的DataGrids有点熟悉。我在WPF中有一个绑定到DataTable的DataGrid,它是通过SQL查询中的SQLDataAdapter填充的。我对查询中的字段使用了DataGridTextColumn绑定(它们在网格上以ReadOnly输出)。我也有另一个带有文本框的DataGridTemplateColumn。该文本框未绑定任何数据,而是显示在与数据相邻的每一行中。用户可以在该行旁边的TextBox中输入。最后,我还有一个按钮的DataGridTemplateColumn,该按钮调用Sub来检索用户选择的(以及用户输入的数据)。单击后,我在Sub后面有一个代码来检索选定的行和指定的列值(我已经完成了此操作),并且我想检索用户已输入到texbox中的输入。是后者,我无法弄清楚该怎么做。我研究了几个小时。我见过类似的解决方案,但不完全是我想做的。我无法弄清楚如何从文本框中获取所选行的用户输入。这是我的XAML,代码隐藏的Sub和屏幕截图。
<!--bound columns-->
<DataGridTextColumn Binding="{Binding InvProjectID}" Header="InvProjectID" Width="100" IsReadOnly="True" Visibility="Visible"/>
<DataGridTextColumn Binding="{Binding NSN}" Header="NSN" Width="100" IsReadOnly="True"/>
<DataGridTextColumn Binding="{Binding Nomenclature}" Header="Nomenclature" Width="100" IsReadOnly="True"/>
<!--select button-->
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Click="SelectInvProjectID">Select</Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<!--textbox-->
<DataGridTemplateColumn Header="mytextbox">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox x:Name="txtUserEnteredText" Width="50"></TextBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
Private Sub SelectInvProjectID(sender As Object, e As RoutedEventArgs)
'set selected column and row selected to variable (column name is InvProjectID)
Dim strSelectedInvProjectID As String = ""
strSelectedInvProjectID = dgTestGrid.SelectedItem("InvProjectID")
'set entered text to variable HOW????
Dim strUserEnteredText As String = ""
'strUserEnteredText = ??????????
MessageBox.Show("Selected InvProjectID = " & strSelectedInvProjectID & vbCrLf & vbCrLf & "Text Entered = " & strUserEnteredText)
End Sub
答案 0 :(得分:0)
我终于找到了解决方案。需要将ContentPresenter连接到带有文本框的列(第4列)和用户选择的行,并将其设置为ContentTemplate。然后使用.FindName方法。
Dim myCp As ContentPresenter = dgTestGrid.Columns(4).GetCellContent(dgTestGrid.SelectedItem)
Dim myTemplate = myCp.ContentTemplate
Dim mytxtbox As TextBox = myTemplate.FindName("txtUserEnteredText", myCp)
strUserEnteredText = mytxtbox.Text
下面的参考文章: