Получить пользовательский ввод из текстового поля WPF DataGrid - PullRequest
0 голосов
/ 28 июня 2018

Я новичок в WPF, но я немного знаком с DataGrids в более старых версиях .net. У меня есть DataGrid в WPF, который связан с DataTable, заполненный через SQLDataAdapter из запроса SQL. Я использую привязку DataGridTextColumn для полей из моего запроса (они выводятся как ReadOnly в сетке). У меня также есть другой DataGridTemplateColumn с TextBox. Это текстовое поле не привязано ни к каким данным, и оно появляется в каждой строке рядом с данными. Пользователь может ввести в 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 голосов
/ 05 июля 2018

Я наконец нашел решение. Необходимо подключить 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...