从WPF DataGrid文本框中获取用户输入

时间:2018-06-28 19:23:30

标签: c# wpf vb.net datagrid textbox

我是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

WPF Datagrid

1 个答案:

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

下面的参考文章:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/8f7a712a-5eec-4c0b-87cb-e131a3cb546b/how-do-you-get-the-control-inside-a-wpf-datagridcell?forum=wpf