Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/22: Рейтинг темы: голосов - 22, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 17.11.2013
Сообщений: 107
Записей в блоге: 2
1

Как прокрутить datagrid вниз при добавлении строки?

12.07.2016, 13:19. Показов 4066. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите разобраться - как при добавлении строк в datagrid сделать так, чтобы scrollbar "шёл" вниз, а не вверх?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.07.2016, 13:19
Ответы с готовыми решениями:

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

[WPF] Не обновляется DataGrid при добавлении данных!
У меня есть Datagrid который берет строки из класса Patient Класс Patient хранит в себе...

При добавлении (удалении) данных в DataGrid не происходит обновление
Пытаюсь создать часть приложения, которая позволяет работать со списком пользователей...

DataGrid + DataTable + БД MS Sql ошибка при изменении/добавлении записи
Доброго всем времени суток. Работаю с VS2015 несколько дней - тапками и табуретками прошу не...

16
Эксперт .NET
1838 / 1346 / 427
Регистрация: 10.06.2011
Сообщений: 2,126
12.07.2016, 15:00 2
После добавления элемента в таблицу вызовите метод DataGrid.ScrollIntoView, передав туда добавленный элемент
0
0 / 0 / 0
Регистрация: 17.11.2013
Сообщений: 107
Записей в блоге: 2
12.07.2016, 15:56  [ТС] 3
Вот так? Результата нет, видимо я что-то не то делаю
C#
1
datagrid1.ScrollIntoView(true);
0
Эксперт .NET
1838 / 1346 / 427
Регистрация: 10.06.2011
Сообщений: 2,126
12.07.2016, 16:07 4
Я же написал
Цитата Сообщение от novikov.ea Посмотреть сообщение
После добавления элемента в таблицу вызовите метод DataGrid.ScrollIntoView, ПЕРЕДАВ ТУДА ДОБАВЛЕННЫЙ ЭЛЕМЕНТ
Или вы серьёзно добавляете в таблицу объект true для отображения его в DataGrid?)
0
0 / 0 / 0
Регистрация: 11.08.2019
Сообщений: 1
05.12.2020, 17:59 5
Верно говорили что нужно передать объект в ScrollIntoView() вот только true - это не объект.
Нужно просто передать последний элемент в таблице:

C#
1
2
3
DataGrid table = new DataGrid();
 
table.ScrollIntoView(table.Items[table.Items.Count - 1]);
0
26 / 11 / 1
Регистрация: 20.05.2015
Сообщений: 211
17.07.2022, 16:14 6
Усложню вопрос .
А если речь о MVVM и привязках, как вызывать скрол DataGrid к нужной строке при добавлении/изменении привязанной коллекции (в идеале - скрол к нужному элементу, для начала - хотя бы в конец).

Допустим есть
XML
1
2
3
<DataGrid ItemsSource="{Binding Collection}" ... >
...
</DataGrid>
В VM Collection у нас - BindingList или ObservableCollection.

C#
1
public BindingList<SomeThing>? Collection { get; set; } = new();
Вопрос, как при добавлении элемента (например в конец) - прокрутить DataGrid к нужному элементу?
События AddingNewItem, TargetUpdated не срабатывают при изменении коллекции.
0
1181 / 623 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
17.07.2022, 17:39 7
Добавьте в проект следующий файл:
Attached property ScrollViewerEx

Потом присоедениете свойство attachedProperties:ScrollViewerEx.AutoScrollToEnd="True"
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
            <ScrollViewer VerticalScrollBarVisibility="Auto"
                          attachedProperties:ScrollViewerEx.AutoScrollToEnd="True"
                          HorizontalScrollBarVisibility="Disabled">
                <ItemsControl ItemsSource="{Binding Messages}"
                              VirtualizingStackPanel.IsVirtualizing="True"
                              VirtualizingStackPanel.VirtualizationMode="Recycling">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <VirtualizingStackPanel/> 
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
 
                    <ItemsControl.ItemContainerStyle>
                        <Style>
                            <Setter Property="FrameworkElement.Margin" Value="2"/>
                        </Style>
                    </ItemsControl.ItemContainerStyle>
                </ItemsControl>
            </ScrollViewer>
1
26 / 11 / 1
Регистрация: 20.05.2015
Сообщений: 211
17.07.2022, 18:51 8
limeniye, Спасибо. Хотя удивительно, что нужно целое свойство для этого делать.
0
1181 / 623 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
17.07.2022, 18:59 9
Цитата Сообщение от werymag Посмотреть сообщение
limeniye, Спасибо. Хотя удивительно, что нужно целое свойство для этого делать.
Кто сказал, что нужно? Можете не создавать, просто потом придётся одно и то же кучу раз копипастить.
0
Модератор
Эксперт .NET
15465 / 10711 / 2786
Регистрация: 21.04.2018
Сообщений: 31,531
Записей в блоге: 2
17.07.2022, 23:41 10
Цитата Сообщение от limeniye Посмотреть сообщение
Добавьте в проект следующий файл:
Attached property ScrollViewerEx
Чем вызвано нарушение правил именования при объявлении AttachedProperty?
Пробовали задать не значение, а привязку к ScrollViewerEx.AutoScrollToEnd?

И почему у него такой сложный сеттер?
Тем более что есть метод вызываемый при его изменении.
Всю логику сеттера надо переместить в этот метод.
0
1181 / 623 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
18.07.2022, 00:07 11
Элд Хасп, автор не я, скопипащенно ещё месяц назад с другого немалоизвестного всем ресурса.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Пробовали задать не значение, а привязку к ScrollViewerEx.AutoScrollToEnd?
Не пробовал. Есть какие-то опасения?
0
2304 / 1667 / 326
Регистрация: 14.08.2018
Сообщений: 5,484
Записей в блоге: 4
18.07.2022, 08:58 12
werymag, limeniye, Вот ещё вариант этого свойства
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
using System;
using System.Windows.Controls;
 
using Microsoft.Xaml.Behaviors;
 
namespace HRClient.Behaviors
{
    public class ScrollIntoViewBehavior : Behavior<DataGrid>
    {
        protected override void OnAttached()
        {
            base.OnAttached();
            AssociatedObject.SelectionChanged +=
                new SelectionChangedEventHandler(AssociatedObjectSelectionChanged);
        }
        protected override void OnDetaching()
        {
            AssociatedObject.SelectionChanged -=
                new SelectionChangedEventHandler(AssociatedObjectSelectionChanged);
            base.OnDetaching();
        }
 
        private async void AssociatedObjectSelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (sender is DataGrid)
            {
                DataGrid grid = sender as DataGrid;
                object item = grid?.SelectedItem;
 
                if (item != null)
                {
                    Action action = () =>
                    {
                        if (grid != null && item != null)
                        {
                            grid.UpdateLayout();
                            grid.ScrollIntoView(item, null);
                        }
                    };
 
                    if (grid.Dispatcher.CheckAccess())
                    {
                        action();
                    }
                    else
                    {
                        await grid.Dispatcher.BeginInvoke(action);
                    }
                }
            }
        }
    }
}
Добавлено через 9 минут
Из NuGet поставить вот это - https://github.com/microsoft/XamlBehaviorsWpf
В XAML, в разделе Window, подключить вот это
XML
1
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
В XAML в DataGrid добавить вот это
XML
1
2
3
4
5
6
7
8
9
<DataGrid ItemsSource="{Binding MyCollection}"
          SelectedItem="{Binding SelectedEmployee}">
    <i:Interaction.Behaviors>
        <behaviors:ScrollIntoViewBehavior/>
    </i:Interaction.Behaviors>
    <DataGrid.Columns>
    ...
    </DataGrid.Columns>
</DataGrid>
Добавлено через 42 секунды
Ну и в методе изменения коллекции выставлять SelectedItem куда надо...
2
Модератор
Эксперт .NET
15465 / 10711 / 2786
Регистрация: 21.04.2018
Сообщений: 31,531
Записей в блоге: 2
18.07.2022, 09:31 13
Цитата Сообщение от limeniye Посмотреть сообщение
Есть какие-то опасения?
AP-свойство это AutoScrollProperty.
А методы Get/SettAutoScrollToEnd - это CLR оболочка.
Дизайнер и Компилятор XAML при анализе обращения к "неродному" свойству сначала ищут AP-свойство добавляя к нему постфикс Property. Это определенно соглашением (контрактом) WPF: Создание присоединенного свойства.
Если свойство не находится, то ищется его CLR-оболочка добавлением префиксов Get/Set.

Что из этого следует:
1) Так как вы нарушили соглашение имён, то возможно привязку не удастся создать, так как для неё нужно AP-свойство, а не его оболочка;
2) Даже, если внесены изменения в актуальные Дизайнер и Компилятор XAML и они смогут найти AP-свойство по регистрационным данным (но мне кажется это весьма сомнительно, я не слышал о таком) и они смогут задать привязку к AP-свойству, то вся логика Set/Get методов будет обходится, так как привязка работает напрямую с AP/DP-свойствами, а не их CLR оболочками. И вся ваша логика сеттера не будет исполнена.

Добавлено через 21 минуту
Цитата Сообщение от Сладуля Посмотреть сообщение
как при добавлении строк в datagrid сделать так, чтобы scrollbar "шёл" вниз, а не вверх?
Вы немного расплывчато обозначили задачу.
В View можно прослушивать изменение представляемого списка и изменение выбранного элемента.
При изменении выделения, наверное, логично прокручивать список до видимости выбранного элемента.
Насколько понял, это делает реализация от Andrey-MSK.

А вот с изменением списка сложнее.
У него есть следующие действия (изменения): очистка, вставка элементов, удаление элементов, перестановка элементов, замена элементов.
См. NotifyCollectionChangedAction.
Как я понял, в варианте от limeniye, при любом действии происходит примотка до конца списка.
Что в общем виде может быть не всегда верно.
Например, возможна же вставка в начало или заменена первого элемента.
Зачем тогда проматывать в конец?
Наоборот нужна промотка в начало.
В общем, обработка изменения списка вызывает много концептуальных воппросв.

На мой взгляд оптимальными являются два варианта:
1) Автопромотка до выделенного элемента;
2) Или явный вызов в VM промотки до указанного элемента. Независимо от того выделен он, добавлен, изменён и т.п.
Что то типа метода ShowElement(SomeType element) работающего через событие или внедрение зависимого делегата.
0
2304 / 1667 / 326
Регистрация: 14.08.2018
Сообщений: 5,484
Записей в блоге: 4
18.07.2022, 09:48 14
Элд Хасп, Ну дак с Behavior можно промотать куда угодно по условию, хоть на новый элемент, хоть на редактируемый, просто присваиваем SelectedItem что нужно и всё:
C#
1
2
3
4
5
private void FindEmployeeExecuted(object obj)
{
    // Проматываем список куда нужно, работает любое условие
    SelectedEmployee = Employees.FirstOrDefault(e => e.LastName == SelectedLastName);
}
0
1181 / 623 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
18.07.2022, 10:56 15
Andrey-MSK, я не понял, зачем Вам Behavior, в данном случае.
На мой взгляд — неуместно.
0
2304 / 1667 / 326
Регистрация: 14.08.2018
Сообщений: 5,484
Записей в блоге: 4
18.07.2022, 11:02 16
Цитата Сообщение от limeniye Посмотреть сообщение
я не понял, зачем Вам Behavior, в данном случае.
Нашел это решение для перемотки DataGrid на SelectedItem из ViewModel, тут на форуме реализацию Behavior манёк подправили и так его и использую.
Если без этого Behavior назначить SelectedItem, то он конечно переедет туда, но вот DataGrid не перемотается на него...
0
Модератор
Эксперт .NET
15465 / 10711 / 2786
Регистрация: 21.04.2018
Сообщений: 31,531
Записей в блоге: 2
18.07.2022, 11:32 17
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
просто присваиваем SelectedItem что нужно и всё
Я понял. И написал об этом.
Но так же может потребоваться задача показать элемент, но без его выбора.
Например, в ItemsControl.

Добавлено через 3 минуты
Цитата Сообщение от limeniye Посмотреть сообщение
зачем Вам Behavior, в данном случае.
На мой взгляд — неуместно.
Ну....., я бы так не сказал.
Что такое "автоскрул до нужного элемента"?
На мой взгляд, это всё же не значение (свойство), а поведение.
Да, конечно, тот же Behavior под капотом это тоже AP-свойство.
Но разработчики привыкли его ассоциировать именно с заданием нового поведения элементу.

Добавлено через 6 минут
limeniye, кстати, в реализации Behavior намеренно используется нарушение имён для AP-свойств.
По сути он хоть и работает через AP-свойство, но по функциональной логике это обычный статический CLR метод, который из-за префикса Get распознаётся Дизайнером и Компилятором XAML как чужое свойство.
AP-свойство в Behavior используется для слабой связи между объектом (UI элементом) и внешней коллекцией Behaviors.
Но можно тоже самое реализовать и через словарь со слабыми ключами.

Добавлено через 11 минут
Вот таким словарём (или таблицей?) можно заменить скрытое AP-свойство: ConditionalWeakTable<TKey,TValue>.
1
18.07.2022, 11:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.07.2022, 11:32
Помогаю со студенческими работами здесь

Как при выделении строки в DataGrid передавать ее в свойство?
Не подскажете как при выделении строки в datagrid передавать ее в свойство?

Как применить стиль строки dataGrid к определенному dataGrid
Доброго всем времени суток! Спасибо, что уделили мне свое время! Есть стиль для строк датагрида:...

При прокрутке вниз блок убирается а если прокрутить вверх то появляется
Вот на сайте http://samsonos.com шапка так организована как сделать что б убиралась шапка если...

Перемещение строк в консоли вниз при добавлении новой
Здравствуйте. Существует проблема. В консоли выведен текст. Нужно до этого текста вывести строку....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru