Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
82 / 82 / 32
Регистрация: 17.02.2016
Сообщений: 226
1
.NET 4.x

Как получить имя столбца при вызове контекстного меню в ListView?

05.12.2017, 11:21. Показов 1071. Ответов 2

Author24 — интернет-сервис помощи студентам
Доброго утра, дня или вечера.
Собственно, сабж в заголовке.
Код:
Кликните здесь для просмотра всего текста
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<Window x:Class="ListViewProblemApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ListView Name="DemoListView" 
                  LayoutUpdated="ListView_LayoutUpdated"
                  ContextMenuOpening="DemoListView_OnContextMenuOpening">
            <ListView.ContextMenu >
                <ContextMenu Name="PopupFilterContextMenu" Focusable="False"
                             Background="#4D6082" Padding="0">
                    <ContextMenu.ItemsPanel>
                        <ItemsPanelTemplate>
                            <StackPanel Background="#4D6082"/>
                        </ItemsPanelTemplate>
                    </ContextMenu.ItemsPanel>
                    <MenuItem StaysOpenOnClick="True" >
                        <MenuItem.Header>
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition/>
                                    <ColumnDefinition Width="100"/>
                                    <ColumnDefinition/>
                                </Grid.ColumnDefinitions>
                                <TextBlock Name="PopupFilterName" Grid.Column="0" 
                                           Foreground="PapayaWhip"
                                           VerticalAlignment="Center"/>
                                <TextBox Name="PopupFilterValue" Margin="5 0" Grid.Column="1"  />
                                <Button Name="PopupFilterConfirmButton" Grid.Column="2" Cursor="Hand">
                                    Фильтровать
                                </Button>
                            </Grid>
                        </MenuItem.Header>
                    </MenuItem>
                </ContextMenu>
            </ListView.ContextMenu>
            <ListView.View>
                <GridView>
                    <GridView.ColumnHeaderContainerStyle>
                        <Style>
                            <Setter Property="TextElement.FontSize" Value="12" />
                        </Style>
                    </GridView.ColumnHeaderContainerStyle>
                    <GridView.Columns>
                        <GridViewColumn DisplayMemberBinding="{Binding Path=Id}" Width="100" >
                            <GridViewColumnHeader Name="Id" Content="Код" />
                        </GridViewColumn>
                        <GridViewColumn>
                            <GridViewColumnHeader Name="Name" Content="Имя" />
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding Path=Name}" />
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                    </GridView.Columns>
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>
</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
56
57
58
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
 
namespace ListViewProblemApp
{
    internal class User
    {
        public long Id { get; set; }
        public string Name { get; set; }
        public User(long id, string name)
        {
            Id = id;
            Name = name;
        }
    }
 
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DemoListView.ItemsSource = new List<User>
            {
                new User(0, "a"), new User(1, "b"), new User(2, "c"),
                new User(3, "d"), new User(4, "e"), new User(5, "f"),
                new User(6, "g"), new User(7, "h"), new User(8, "i")
            };
        }
 
        private void DemoListView_OnContextMenuOpening(object sender, ContextMenuEventArgs e)
        {
            // TODO Как тут получить имя столбца ??
        }
 
        private void ListView_LayoutUpdated(object sender, EventArgs eventArgs)
        {
            const double scrollBarSize = 30;
            var autoFillColumnIndex = ((GridView)DemoListView.View).Columns.Count - 1;
            if (double.IsNaN(DemoListView.ActualWidth))
            {
                DemoListView.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
            }
            var remainingSpace = DemoListView.ActualWidth;
            for (var i = 0; i < ((GridView)DemoListView.View).Columns.Count; i++)
            {
                if (i != autoFillColumnIndex)
                {
                    remainingSpace -= ((GridView)DemoListView.View).Columns[i].ActualWidth;
                }
            }
            remainingSpace -= scrollBarSize;
            var resultColumnSize = remainingSpace >= 0 ? remainingSpace : 0;
            ((GridView)DemoListView.View).Columns[autoFillColumnIndex].Width = resultColumnSize;
        }
    }
}


Добавлено через 1 час 32 минуты
UPD: сам нашёл способ, может кому пригодится.
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
private void DemoListView_OnContextMenuOpening(object sender, ContextMenuEventArgs contextMenuEventArgs)
{
    var namesTuple = GetHeaderGridView(sender as ListView, contextMenuEventArgs.CursorLeft);
    MessageBox.Show(namesTuple?.ToString());
}
 
private static Tuple<string, string> GetHeaderGridView(ListView listView, double cursorLeftOffset)
{
    var gridView = listView?.View as GridView;
    var columns = gridView?.Columns;
    if (columns == null)
    {
        return null;
    }
    GridViewColumn activeGridViewColumn = null;
    double leftOffset = 0;
    foreach (var item in columns)
    {
        leftOffset += item.ActualWidth;
        if (leftOffset > cursorLeftOffset)
        {
            activeGridViewColumn = item;
            break;
        }
    }
    var header = activeGridViewColumn?.Header as GridViewColumnHeader;
    if (header == null)
    {
        return null;
    }
    var headerName = header.Name;
    var headerContent = header.Content.ToString();
    return new Tuple<string, string>(headerName, headerContent); ;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.12.2017, 11:21
Ответы с готовыми решениями:

Отображение контекстного меню у заголовка столбца в ListView
Имеется ListView в режиме VirtualMode, Details. Нужно при щелчке по столбцу правой кнопкой мыши...

Мерцание при вызове контекстного меню
Всем добрый вечер! Друзья подскажите. Есть не стандартное контекстное меню и при вызове его...

При вызове контекстного меню ворд зависает
Когда выделяю в ворде 2007 (windows 7) текст потом нажимаю на правую кнопку мыши, появляются...

Сложности при вызове контекстного меню в Windows
Здравствуйте. Столкнулся со следующей проблемой: при нажатии на правую кнопку мыши по какому-либо...

2
294 / 234 / 58
Регистрация: 03.02.2011
Сообщений: 1,993
Записей в блоге: 1
05.12.2017, 12:49 2
Чего-то я не пойму. Если вызывается ПКМ, то в таблице что-то уже должно быть выделено, так? Тогда чем 2 строчки кода не подойдут
C#
1
2
3
4
5
private void DataGrid_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    var cell = SpecTable.CurrentCell;
    var columnName = cell.Column.Header?.ToString()
}
0
82 / 82 / 32
Регистрация: 17.02.2016
Сообщений: 226
05.12.2017, 12:58  [ТС] 3
skilllab, это не DataGrid, а ListView c DataView.
Я бы и раз использовать DataGrid, но он не так как мне нужно работает с группировкой и ещё парой фич.

Исправленный код, я не учёл координаты контролов в ContextMenuEventArgs:
Кликните здесь для просмотра всего текста
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
private void DemoListView_OnContextMenuOpening(object sender, ContextMenuEventArgs contextMenuEventArgs)
{
    var listViev = sender as ListView;
    var contextPoint = new Point(contextMenuEventArgs.CursorLeft, contextMenuEventArgs.CursorTop);
    Point listVievPoint;
    var isParentVisual = contextMenuEventArgs.OriginalSource is Border;
    if (isParentVisual)
    {
        listVievPoint = contextPoint;
    }
    else
    {
        var control = contextMenuEventArgs.OriginalSource as UIElement;
        if (control == null)
        {
            return;
        }
        listVievPoint = control.TranslatePoint(contextPoint, listViev);
    }
    var namesTuple = GetHeaderGridView(sender as ListView, listVievPoint);
    MessageBox.Show(namesTuple?.ToString());
}
 
private Tuple<string, string> GetHeaderGridView(ListView listView, Point listVievPoint)
{
    var gridView = listView?.View as GridView;
    var columns = gridView?.Columns;
    if (columns == null)
    {
        return null;
    }
    GridViewColumn activeGridViewColumn = null;
    double leftOffset = 0;
    foreach (var item in columns)
    {
        leftOffset += item.ActualWidth;
        if (leftOffset > listVievPoint.X)
        {
            activeGridViewColumn = item;
            break;
        }
    }
    var header = activeGridViewColumn?.Header as GridViewColumnHeader;
    if (header == null)
    {
        return null;
    }
    var headerName = header.Name;
    var headerContent = header.Content.ToString();
    return new Tuple<string, string>(headerName, headerContent); ;
}
0
05.12.2017, 12:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.12.2017, 12:58
Помогаю со студенческими работами здесь

Подвисание и перезагрузка проводника при вызове контекстного меню
На днях появилась такая проблема, навожу курсор на папку, вызываю правой кнопкой мыши контекстное...

Глюк: перезапуск проводника при вызове контекстного меню exe файлов.
При нажатии правой кнопкой мыши на любом из exe файлов закрываются все окна проводника,...

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

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


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

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