Arunkumar Murugesan Ответов: 1

Datagrid text не принимает многострочное текстовое содержимое в WPF


Привет Команда,

У меня есть Datagrid с привязкой itemssource как Datatable. Таблица приводит к динамической привязке в сетке. Поэтому я не указывал никаких столбцов в Xaml.

Я предоставил опцию добавления, редактирования, удаления в сетке. Проблема в том, что я не могу добавить многострочный текст в столбец текстового поля datagrid. Он принимает только первую строку содержимого.

Что я уже пробовал:

Вот мой код Xaml :

<pre><DataGrid
                        x:Name="autoBook_Datagrid"
                        HorizontalScrollBarVisibility="Auto"
                        VerticalScrollBarVisibility="Auto"
                        ScrollViewer.CanContentScroll="True"
                        BorderBrush="{StaticResource GreenBrush}"
                        HorizontalAlignment="Left"
                        VerticalAlignment="Top"
                        RowHeight="25"
                        GridLinesVisibility="All"
                        ClipboardCopyMode="IncludeHeader"
                        ItemsSource="{Binding DynamicBindingTable, UpdateSourceTrigger=PropertyChanged}"
                        CanUserAddRows="{Binding CanAddNewRows, UpdateSourceTrigger=PropertyChanged}"
                        VirtualizingPanel.VirtualizationMode="Recycling"
                        VirtualizingPanel.ScrollUnit="Pixel"
                        EnableColumnVirtualization="True"
                        EnableRowVirtualization="True"
                        FocusVisualStyle="{StaticResource ButtonFocusVisual}"
                            CanUserDeleteRows="False"
                        >



Как правило, мы можем установить свойства acceptsreturs в текстовое поле, чтобы обновить многострочного текста. Но здесь я не знаю, что делать в этом случае.

Не могли бы вы помочь мне в этом вопросе обновить многострочный текст в тексте datagrid?

С уважением,
Arunkumar Murugesan

1 Ответов

Рейтинг:
0

Maciej Los

Проверить это: wpfdatagrid - WPF DataGridTextColumn многострочный ввод - переполнение стека[^]

<DataGridTextColumn Header="Message" Binding="{Binding Path=Message}"  Width="Auto">
        <DataGridTextColumn.ElementStyle>
            <Style TargetType="TextBlock">
                <Setter Property="TextWrapping" Value="Wrap" />
            </Style>
        </DataGridTextColumn.ElementStyle>
        <DataGridTextColumn.EditingElementStyle>
            <Style TargetType="TextBox">
                <Setter Property="TextWrapping" Value="Wrap" />
                <Setter Property="AcceptsReturn" Value="true" />
            </Style>
        </DataGridTextColumn.EditingElementStyle>
    </DataGridTextColumn>


Arunkumar Murugesan

Привет Мацей,

Спасибо за ваше обновление. В вашем решении мы знаем имя столбца и можем легко установить стиль. Но в моем случае я буду загружать в сетку несколько табличных значений. Поэтому я не упомянул ни одного имени столбца в xaml. Я привязки объекта DataTable значения непосредственно в таблице. Он очень динамичный.

В данном случае, как я могу решить эту проблему?

Maciej Los

WPF очень гибкий. Вы можете определить вид(ы). Таким образом, в зависимости от того, какие данные вы хотите привязать, вы можете выбрать соответствующий вид. Видеть:
c# - Как изменить представление в WPF? - переполнение стека[^]
c# - переключение представлений в MVVM wpf - переполнение стека[^]
Переключение между представлениями xaml в mvvm | technical-recipes.com[^]
Запуск приложения WPF/MVVM: навигация между представлениями[^]

Arunkumar Murugesan

Да, Мацей. Я с этим согласен. Но здесь у меня есть почти 200 таблиц, и я могу получить результат каждой таблицы из SQL и непосредственно привязать ее к сетке, не подготавливая никаких столбцов. В этом случае мы не можем использовать множественное представление, верно?

Поэтому в этом случае мне просто нужно принимать многострочный текст всякий раз, когда столбец datagrid редактируется.

Maciej Los

Я тебя не понимаю... Вы хотите редактировать табличные данные непосредственно в форме WPF? В WPF вы используете шаблон MVVM (Model-View-ViewModel) для "обслуживания" данных клиенту. Таким образом, если ваше приложение не реализует MVVM patten, это не имеет никакого смысла... Извиняюсь.

Arunkumar Murugesan

На самом деле то, что я сделал до сих пор, это,

1. Я перечислил таблицы в поле со списком. Мы получим результат из SQL на основе выбранных таблиц. Каждая таблица имеет минимум 20 столбцов.
2. В таком случае, я непосредственно привязки объекта DataTable в элементе управления DataGrid. Все это я реализовал только с помощью шаблона MVVM
3. Также я предоставил опцию редактирования значений ячеек. Мы можем дважды щелкнуть ячейку, чтобы вставить значения для обновления.
4. в этом случае я попытался вставить содержимое в ячейку сетки, как содержимое тела почты. Из этого содержимого первая строка значения вставляется только в ячейку сетки. Все содержимое будет вставлено в ячейку сетки. На самом деле это моя проблема.

Arunkumar Murugesan

Можете ли вы понять, что я пытаюсь здесь передать?

Maciej Los

Да, я понимаю, чего вы хотите достичь, но это кажется мне (очень) странным.
Разве вы не можете просто показать текстовое поле под (или над) сеткой данных, чтобы включить редактирование "mulitline"? Это было бы намного проще.
[Редактировать]
Кстати, взгляните на это: Привязка данных - лучший способ реализации привязки данных в .NET | Microsoft Docs[^]

Я бы реализовал что-то похожее на это: Динамическая загрузка XAML – Часть 1 – динамическая загрузка представлений – Bruno Sonnino[^]

Arunkumar Murugesan

&ЛТ;элемент управления DataGrid
х:имя="autoBook_Datagrid"
="" horizontalscrollbarvisibility="Auto" verticalscrollbarvisibility="Auto" scrollviewer.cancontentscroll="True" borderbrush="{StaticResource GreenBrush}" horizontalalignment="Left" verticalalignment="Top" rowheight="25" gridlinesvisibility="All" clipboardcopymode="IncludeHeader" itemssource="{Binding DynamicBindingTable, UpdateSourceTrigger=PropertyChanged}" canuseraddrows="{Binding CanAddNewRows, UpdateSourceTrigger=PropertyChanged}" virtualizingpanel.virtualizationmode="Recycling" virtualizingpanel.scrollunit="Pixel" enablecolumnvirtualization="True" enablerowvirtualization="True" focusvisualstyle="{StaticResource ButtonFocusVisual}" canuserdeleterows="False">

в этом коде, как я мог бы добавить текстовое поле под datagrid? Я начинаю путаться. Можете ли вы увидеть какой-то код, как то, что вы сказали pls.

Maciej Los

См. обновленный комментарий.

Arunkumar Murugesan

&ЛТ;DataGrid с autogeneratecolumns="false" - в Х:имя="мастер" canuseraddrows="ложных" canuserdeleterows="истинный" сетки.строка="1"
="" что ItemsSource="{привязки клиентов}" для selecteditem="{привязки SelectedCustomer, режим=с двусторонним движением}"&ГТ;
&ЛТ;элемент управления DataGrid.колонны&ГТ;
&ЛТ;datagridtextcolumn х:имя="customerIDColumn" привязки="{путь привязки=Кодклиента}" заголовок="ID клиента" ширина="80"и GT;
&ЛТ;datagridtextcolumn х:имя="companyNameColumn" привязки="{путь привязки= "название", ValidatesOnDataErrors=правда}" заголовок="название компании" ширина="300"&ГТ;
&ЛТ;datagridtextcolumn х:имя="cityColumn" привязки="{путь привязки=город}" заголовок="город" ширина="100"&ГТ;
&ЛТ;datagridtextcolumn х:имя="countryColumn" привязки="{путь привязки=страна}" заголовок="кантри" ширина="100"&ГТ;



В своем коде вы определили столбец, который должен отображаться в сетке. В этом случае мы можем легко добавить "Accepteturs = True" для принятия многострочного текста в ячейке, как показано ниже,


DataGridTemplateColumn.CellEditingTemplate>
<datatemplate>
&ЛТ;текстовое поле текст="{путь привязки= "название", режим=с двусторонним движением}" acceptreturs="истинный" TextWrapping значение="обернуть"и GT;



Но в моем случае я не могу определить имена столбцов, так как это динамические таблицы. Я думаю, что это проще. Но мой разум где-то застрял.

Maciej Los

Похоже, это то, чего ты хочешь.: WPF datagrid: Как установить specifc setter в C# вместо XAML - Stack Overflow[^]
Вы можете добавить пользовательский сеттер в текстовый столбец программно.

Arunkumar Murugesan

Проверю этого Мацея. Спасибо.