Форум программистов, компьютерный форум, киберфорум
C#: XAML
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/76: Рейтинг темы: голосов - 76, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205

Avalonia (отображение списка строк)

12.01.2022, 22:23. Показов 21033. Ответов 98
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Подскажите, пожалуйста, в каком элементе управления в Авалонии лучше выводить список строк, чтобы потом можно было выделить какие-то строки и скопировать их, например, в Excel? Заранее спасибо!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.01.2022, 22:23
Ответы с готовыми решениями:

Avalonia
Приходилось ли кому работать с сабжем ? С WPF знаком не сильно. Но нужна кроссплатформенность. Собственно сабж это и позволяет, грубо...

ListView - ping строки, выбираемой из списка/отображение списка онлайн машин в сети
Доброй ночи, форумчане! Возник насущный вопрос... Может быть, уже и обсуждался, но, по неведомым мне причинам, или я не понял, или не...

Скрытие\отображение нового списка при выборе значения из списка
Например при выборе option(1,2,3,5) должен появиться другой список который указывает количество сахара, а при выборе option(4) должен...

98
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,576
27.01.2022, 09:21
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Sun1212 Посмотреть сообщение
Как сделать, чтобы все элементы списка оказались в одном TextBox, чтобы потом можно было выделить несколько строк и скопировать их в Excel?
Вообще-то выше был пример, в котором выделенные элементы списка отображались в одном TextBox, чтобы их можно было скопировать куда угодно...
1
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
27.01.2022, 09:25  [ТС]
Andrey-MSK, спасибо, а если нужно сделать копирование в Excel или Word не с помощью кнопки "Сохранить отчет в Еxcel", а с помощью контекстного меню при выделении нескольких строк ListBox?
0
 Аватар для Andrey-MSK
3386 / 2272 / 388
Регистрация: 14.08.2018
Сообщений: 7,690
Записей в блоге: 4
27.01.2022, 09:30
Цитата Сообщение от Sun1212 Посмотреть сообщение
а с помощью контекстного меню при выделении нескольких строк ListBox?
Тогда на этот пункт меню вешается команда, которая забирает коллекцию SelectedItems из привязанных данных этого элемента и делает с ними тоже самое что и выше.
Запомните - элемент UI только отображает данные, он не хранит их и не манипулирует ими.
1
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
27.01.2022, 09:31  [ТС]
Someone007, вот этот вариант?

Цитата Сообщение от Someone007 Посмотреть сообщение
<ListBox Grid.Row="1" Items="{Binding Items}"
                          SelectedItems="{Binding SelectedItems}"
                           SelectionMode="Multiple" />
                    <TextBox Grid.Row="2" Text="{Binding SelectedItemsAsText}" />
Если в ListBox будет 200 строк и ниже будет еще TextBox c выделенными строками, наверно будет не очень удобно...Хотелось сделать в одном элементе управления возможность выбора строк и с помощью контекстного меню их скопировать, например, в Excel
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,576
27.01.2022, 09:34
Цитата Сообщение от Sun1212 Посмотреть сообщение
Хотелось сделать в одном элементе управления возможность выбора строк и с помощью контекстного меню их скопировать, например, в Excel
Так сделайте, добавьте тоже контекстное меню например, с командой по которой будут копироваться в Clipboard выделенные элементы...
1
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
27.01.2022, 09:34  [ТС]
Andrey-MSK, если не трудно, можете какой-нибудь пример выслать?
0
 Аватар для Andrey-MSK
3386 / 2272 / 388
Регистрация: 14.08.2018
Сообщений: 7,690
Записей в блоге: 4
27.01.2022, 09:44
Sun1212, вот такая команда на моей кнопке
C#
1
2
3
4
        private async void CreateReportExecuted(object obj)
        {
            await CreateXLReportByDateAsync(_eObject, DateStart, DateEnd);
        }
Как видите, она просто вызывает метод, который я показал выше, и передает в него необходимые параметры, к которым привязаны элементы UI - это дата начала и дата окончания периода.

Добавлено через 6 минут
Цитата Сообщение от Sun1212 Посмотреть сообщение
если не трудно, можете какой-нибудь пример выслать?
Почитайте вот это - Паттерн MVVM.
Если поймёте что это такое, тогда практически 90% вопросов сами испарятся. Это конечно с учетом того, что вы умеете делать экспорт в Excel самостоятельно. Если не умеете, то вначале разберитесь с ним, а потом уже переходите на изучение MVVM и WPF.

Добавлено через 3 минуты
Sun1212, Для экспорта я использую ClosedXML. Это проще и быстрее чем Interop. Пример работы с ним в моём сообщении выше.
1
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,576
27.01.2022, 10:07
Вот предыдущий пример, дополненный контекстным меню для копирования выбранных элементов...

XML
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
<Window xmlns="https://github.com/avaloniaui"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:vm="using:AvaloniaApplication3.ViewModels"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
        Height="400" Width="600"
        x:Class="AvaloniaApplication3.Views.MainWindow"
        Icon="/Assets/avalonia-logo.ico"
        Title="AvaloniaApplication3">
 
    <Design.DataContext>
        <vm:MainWindowViewModel/>
    </Design.DataContext>
 
    <TabControl SelectedIndex="{Binding SelectedTabIndex}">
        <TabItem Header="Tab 1" >
            <StackPanel>
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition></RowDefinition>
                        <RowDefinition></RowDefinition>
                        <RowDefinition></RowDefinition>
                    </Grid.RowDefinitions>
 
                    <Button Grid.Row="0" Content="Cформировать" Command="{Binding DoTheThing}" />
                    <ListBox Grid.Row="1" Items="{Binding Items}" SelectedItems="{Binding SelectedItems}" SelectionMode="Multiple">
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding}">
                                    <TextBlock.ContextMenu>
                                        <ContextMenu>
                                            <MenuItem Header="Copy" Command="{Binding $parent[ListBox].DataContext.CopySelectedItems}"/>
                                        </ContextMenu>
                                    </TextBlock.ContextMenu>
                                </TextBlock>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>
                    <TextBox Grid.Row="2" Text="{Binding SelectedItemsAsText}" />
                </Grid>
            </StackPanel>
        </TabItem>
 
        <TabItem Header="Tab 2">
            <TextBlock Text="Hi World!" />
        </TabItem>
    </TabControl>
</Window>
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
54
55
using Avalonia;
using DynamicData;
using DynamicData.Binding;
using ReactiveUI;
using System.Collections.ObjectModel;
using System.Reactive;
using System.Reactive.Linq;
using System.Threading.Tasks;
 
namespace AvaloniaApplication3.ViewModels
{
    public class MainWindowViewModel : ViewModelBase
    {
        private int _selectedTabIndex;
 
        public int SelectedTabIndex
        {
            get => _selectedTabIndex;
            set => this.RaiseAndSetIfChanged(ref _selectedTabIndex, value);
        }
 
        public ReactiveCommand<Unit, Unit> DoTheThing { get; }
        public ReactiveCommand<Unit, Unit> CopySelectedItems { get; }
 
        public ObservableCollection<string> Items { get; set; } = new ObservableCollection<string> { "Иван", "Андрей", "Аполлинарий" };
        public ObservableCollection<string> SelectedItems { get; set; } = new ObservableCollection<string>();
 
        private readonly ObservableAsPropertyHelper<string> _selectedItemsAsText;
        public string SelectedItemsAsText => _selectedItemsAsText.Value;
 
        public MainWindowViewModel()
        {
            DoTheThing = ReactiveCommand.Create(RunTheThing);
            CopySelectedItems = ReactiveCommand.CreateFromTask(CopySelectedItemsToClipboard);
 
            _selectedItemsAsText = SelectedItems
                .ToObservableChangeSet()
                .ToCollection()
                .Select(x => string.Join(" ", x))
                .ToProperty(this, x => x.SelectedItemsAsText);
        }
 
        void RunTheThing()
        {
            SelectedTabIndex = 1;
        }
 
        async Task CopySelectedItemsToClipboard()
        {
            string seleсtedText = string.Join(",", SelectedItems);
            var clipboard = Application.Current.Clipboard;
            await clipboard.SetTextAsync(seleсtedText);
        }
    }
}
3
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
27.01.2022, 20:24  [ТС]
Someone007, попробовала применить Ваш код - получилось, что при выделении нескольких элементов списка контекстное меню не включается...или я неправильно выделяю. Вы как выделяете несколько элементов - с помощью нажатия Ctrl?
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,576
27.01.2022, 20:39
Цитата Сообщение от Sun1212 Посмотреть сообщение
Вы как выделяете несколько элементов - с помощью нажатия Ctrl?
Да. И меню появляется только над текстом, над пустым место не появляется.
0
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
27.01.2022, 20:58  [ТС]
Someone007, Спасибо большое! Всё получилось!

Поясните, пожалуйста, в команде
Command="{Binding $parent[ListBox].DataContext.CopySelectedItems}"/что означает $parent[ListBox].DataContext?
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,576
27.01.2022, 21:28
Цитата Сообщение от Sun1212 Посмотреть сообщение
что означает $parent[ListBox].DataContext?
https://docs.avaloniaui.net/do... n-ancestor

Добавлено через 5 минут
Так наверно лучше будет, меню теперь не только над текстом открывается...
XML
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
<Window xmlns="https://github.com/avaloniaui"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:vm="using:AvaloniaApplication3.ViewModels"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
        Height="400" Width="600"
        x:Class="AvaloniaApplication3.Views.MainWindow"
        Icon="/Assets/avalonia-logo.ico"
        Title="AvaloniaApplication3">
 
    <Design.DataContext>
        <vm:MainWindowViewModel/>
    </Design.DataContext>
 
    <TabControl SelectedIndex="{Binding SelectedTabIndex}">
        <TabItem Header="Tab 1" >
            <StackPanel>
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition></RowDefinition>
                        <RowDefinition></RowDefinition>
                        <RowDefinition></RowDefinition>
                    </Grid.RowDefinitions>
 
                    <Button Grid.Row="0" Content="Cформировать" Command="{Binding DoTheThing}" />
                    <ListBox Grid.Row="1" Items="{Binding Items}" SelectedItems="{Binding SelectedItems}" SelectionMode="Multiple">
                        <ListBox.ContextMenu>
                            <ContextMenu>
                                <MenuItem Header="Copy" Command="{Binding CopySelectedItems}" />
                            </ContextMenu>
                        </ListBox.ContextMenu>
                    </ListBox>
                    <TextBox Grid.Row="2" Text="{Binding SelectedItemsAsText}" />
                </Grid>
            </StackPanel>
        </TabItem>
 
        <TabItem Header="Tab 2">
            <TextBlock Text="Hi World!" />
        </TabItem>
    </TabControl>
</Window>
3
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
29.01.2022, 19:47  [ТС]
Someone007, спасибо Вам большое!!

А если наблюдаемая коллекция Items будет содержать данные вида:

"Название Номер Значение"
"A1 0.01 0.02"
"A2 0.02 0.03"

как сделать, чтобы ListBox отобразился в более читабельном виде с табуляцией?

"Название Номер Значение"
"A1 \t\t\t 0.01 t 0.02"
"A2 \t\t\t 0.02 \t 0.03"
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16164 / 11284 / 2891
Регистрация: 21.04.2018
Сообщений: 33,169
Записей в блоге: 2
29.01.2022, 20:20
Цитата Сообщение от Sun1212 Посмотреть сообщение
как сделать, чтобы ListBox отобразился в более читабельном виде с табуляцией?
Придётся задавать или пользовательский конвертер, или шаблон элемента.
0
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
29.01.2022, 20:48  [ТС]
Элд Хасп, нигде не могу найти про такое, на официальном сайте Авалонии - нет
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
29.01.2022, 21:00
Sun1212, https://metanit.com/sharp/wpf/11.3.php
2
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16164 / 11284 / 2891
Регистрация: 21.04.2018
Сообщений: 33,169
Записей в блоге: 2
29.01.2022, 21:17
Цитата Сообщение от Sun1212 Посмотреть сообщение
нигде не могу найти про такое, на официальном сайте Авалонии - нет
Ну, наш Форум по круче какой-то там Авалонии....


WPF конвертеры
2
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
01.02.2022, 11:58  [ТС]
Цитата Сообщение от Sun1212 Посмотреть сообщение
как сделать, чтобы ListBox отобразился в более читабельном виде с табуляцией?
"Название Номер Значение"
"A1 \t\t\t 0.01 t 0.02"
"A2 \t\t\t 0.02 \t 0.03"
Правильно ли так будет?

XML
1
<TextBlock Text = "{Binding StringFormat='{}   {0}   {1}   {2} '}}" />
Как написать StringFormat, начиная со второй строки? (Можно колонки таблицы оставить без изменения "Название Номер Значение")
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
01.02.2022, 12:10
Цитата Сообщение от Sun1212 Посмотреть сообщение
Как написать StringFormat, начиная со второй строки?
Нужно конвертёр сделать. Попытаетесь?
0
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
01.02.2022, 12:20  [ТС]
limeniye, помогите, пожалуйста!!!

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class StringFormatConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            // Проверка на передаваемый тип String
            if (value is string valStr))
                return valStr;
 
             // Проверка на передаваемый тип Double
              if (value is double valStr && bool.TryParse(valStr, out valStr))
                return !valStr;
        }
}
 
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
             throw new ArgumentException();
        }
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.02.2022, 12:20

Скрытие\отображение нового списка при выборе значения из списка с выбором одного элемента
Добрый день!Существует список из которого нужно выбрать один элемент, с выбором элемента отображается ниже другой список с выбором другого...

Отображение списка и работа с элементом списка
Всем привет. Я пишу программу, используя MVC, которая будет выводить список тестов, сохраненных в базе в браузер. Когда пользователь...

Даны два списка строк. Из списка один удалить повторяющиеся элементы списка два
Даны два списка строк. Из списка один удалить повторяющиеся элементы списка два.

Avalonia, азы
Как на Авалонии создать кнопку, которая при клике на нее вызовет окно, на котором выведется текст, к примеру: Привет, юзер! Саму кнопку я...

Для одноуровневого списка строк сформировать итоговую строку сцеплением всех элементов списка
Определить функцию, которая для одноуровневого списка строк формирует итоговую строку сцеплением всех элементов списка. Элементы в итоговой...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru