1 / 1 / 0
Регистрация: 07.04.2015
Сообщений: 273
1

Получить имя родительского объекта

10.12.2018, 08:50. Показов 5197. Ответов 28
Метки нет (Все метки)

Здравствуйте. Как получить имя контейнера Grid, в котором расположен элемент Button?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.12.2018, 08:50
Ответы с готовыми решениями:

Получить имя объекта под курсором
Ребята как получить имя контрола на который направлена мышка или нажат пальцем?

Как получить имя объекта находящегося в DataGrid.RowDetailsTemplate
Как получить имя объекта находящегося в DataGrid.RowDetailsTemplate? это описано в xaml...

Поиск родительского элемента\объекта
Вообщем, есть нажатие на элемент. Вызывается событие, например: public void...

Как получить доступ к полю родительского объекта
Доброго времени суток! Сразу уточню: вопрос не про наследование, а про отношения parent/child ...

28
165 / 104 / 30
Регистрация: 19.01.2013
Сообщений: 822
10.12.2018, 09:35 2
У баттона должно быть свойство позволяющее показывать его родителя.
0
Модератор
Эксперт .NET
10447 / 7420 / 2034
Регистрация: 21.04.2018
Сообщений: 22,425
Записей в блоге: 2
10.12.2018, 10:24 3
Цитата Сообщение от asdfg15432 Посмотреть сообщение
Здравствуйте. Как получить имя контейнера Grid, в котором расположен элемент Button?
Вы что-то делаете не так, раз Вам понадобилось ИМЯ элемента WPF.
Напишите больше - чего и как Вы делаете.
0
1 / 1 / 0
Регистрация: 07.04.2015
Сообщений: 273
10.12.2018, 10:38  [ТС] 4
Есть 3 таблицы, состоящих из Grid и множество кнопок(одинаковый набор во всех трех) внутри каждого из них. Каждый Grid назван "со смыслом". Записываю в файл нажатые кнопки(ToggleButton) и перед ними в строку хочу записать имя контейнера, чтоб потом считывать в этот же контейнер.
0
Модератор
Эксперт .NET
10447 / 7420 / 2034
Регистрация: 21.04.2018
Сообщений: 22,425
Записей в блоге: 2
10.12.2018, 10:57 5
Цитата Сообщение от asdfg15432 Посмотреть сообщение
Есть 3 таблицы, состоящих из Grid и множество кнопок(одинаковый набор во всех трех) внутри каждого из них. Каждый Grid назван "со смыслом". Записываю в файл нажатые кнопки(ToggleButton) и перед ними в строку хочу записать имя контейнера, чтоб потом считывать в этот же контейнер.
По идее к кнопкам у Вас должны быть привязаны команды. В в привязках команды можно установить элемент источник данных или передать имя через параметр команды. То есть то, что Вы хотите должно делаться в XAML, а не CB.
В CB чтобы найти элемент, надо "пройтись" по логическому дереву контейнеров и в нужном контейнере искать дочерний элемент по типу. Это сложно и чревато ошибками. При любом изменении логического дерева, надо будет переписывать и отлаживать код заново.
0
1433 / 837 / 313
Регистрация: 17.05.2015
Сообщений: 3,215
10.12.2018, 11:37 6
Цитата Сообщение от Элд Хасп Посмотреть сообщение
В CB чтобы найти элемент, надо "пройтись" по логическому дереву контейнеров и в нужном контейнере искать дочерний элемент по типу. Это сложно и чревато ошибками. При любом изменении логического дерева, надо будет переписывать и отлаживать код заново
у каждого контрола есть свойство Parent. Говнокод конечно, но есть
asdfg15432,
C#
1
            string t = button.Parent.Name;
0
Модератор
Эксперт .NET
10447 / 7420 / 2034
Регистрация: 21.04.2018
Сообщений: 22,425
Записей в блоге: 2
10.12.2018, 11:49 7
Цитата Сообщение от Рядовой Посмотреть сообщение
у каждого контрола есть свойство Parent. Говнокод конечно, но есть
Для asdfg15432.
Этот Parent надо приводить к нужному типу. Потом знать на каком узле вверху пересекаются вложенности текущего элемента и искомого. Подыматься до этого узла по цепочке Parent. Потом спускать от этого узла по цепочке Children до искомого элемента.
При любом изменении в цепочках вверх-вниз - весь код насмарку.

Добавлено через 2 минуты
Как вариант можно в XAML привязать нужный элемент к Tag кнопки. А в обработчике кнопки проверять, что находится в свойстве Tag. По-моему, для Вас это самый простой способ.
0
1433 / 837 / 313
Регистрация: 17.05.2015
Сообщений: 3,215
10.12.2018, 12:00 8
Элд Хасп, как я понял, у человека 3 грида, которые не пересекаются между собой. Чтобы сохранить - загрузить ничего такого не потребуется. Просто нужно имя родителя и тот код, из других тем.
Tag в xamle прописывать очуметь можно, там же куча кнопок, о5 же при изменении, все переписывать?
Надо просто с 0 все переделывать
0
Модератор
Эксперт .NET
10447 / 7420 / 2034
Регистрация: 21.04.2018
Сообщений: 22,425
Записей в блоге: 2
10.12.2018, 12:10 9
Цитата Сообщение от Рядовой Посмотреть сообщение
Tag в xamle прописывать очуметь можно, там же куча кнопок, о5 же при изменении, все переписывать?
Почему? В XAML у нужной кнопки привязывается Tag к нужному элементу и всё. Где и как расположены относительно друг друга эти кнопка и элемент, при такой привязке, становится не важно. Как потом не меняй их взаимное положение привязка не нарушится.
Проверить, что у кнопки в Tag в обработчике тоже не проблема.
0
1 / 1 / 0
Регистрация: 07.04.2015
Сообщений: 273
10.12.2018, 12:33  [ТС] 10
Вот нашел кое-что:
C#
1
2
3
4
5
6
7
8
9
10
DependencyObject GetTopLevelControl(DependencyObject control)
{
    DependencyObject tmp = control;
    DependencyObject parent = null;
    while((tmp = VisualTreeHelper.GetParent(tmp)) != null)
    {
        parent = tmp;
    }
    return parent;
}
Возвращает Grid. Но не получается достать его имя.
0
Модератор
Эксперт .NET
10447 / 7420 / 2034
Регистрация: 21.04.2018
Сообщений: 22,425
Записей в блоге: 2
10.12.2018, 13:03 11
У Вас функция возвращает тип DependencyObject, для получения имени его надо привести к типу Grid.
Но Вам не проще прописать в обработчике кнопки (без проверки на совместимость типов):
C#
1
2
3
Button but = (Button) sender;
Grid grid = (Grid)but.parent;
string name = grid.Name;
Этот код подходит если кнопка лежит непосредственно в том Grid имя которого надо узнать.

Добавлено через 7 минут
Полный код обработчика с проверкой на совместимость типов
C#
1
2
3
4
5
6
7
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            string name;
            if (sender is Button but)
                if (but.Parent is Grid grid)
                    name = grid.Name;
        }
0
1 / 1 / 0
Регистрация: 07.04.2015
Сообщений: 273
11.12.2018, 21:22  [ТС] 12
Цитата Сообщение от Элд Хасп Посмотреть сообщение
C#
1
2
3
Button but = (Button) sender;
Grid grid = (Grid)but.parent;
string name = grid.Name;
Это в обработчик Click каждой кнопки, которая находится в Grid прописывать?
0
Модератор
Эксперт .NET
10447 / 7420 / 2034
Регистрация: 21.04.2018
Сообщений: 22,425
Записей в блоге: 2
11.12.2018, 21:28 13
Цитата Сообщение от asdfg15432 Посмотреть сообщение
Это в обработчик Click каждой кнопки, которая находится в Grid прописывать?
Не видя Вашего кода и не зная Вашей цели мне трудно сказать.
Вариантов много. В том числе сделать один обработчик для всех кнопок, всем кнопкам прописать один стиль и в стиле установить обработчик.
0
1 / 1 / 0
Регистрация: 07.04.2015
Сообщений: 273
11.12.2018, 21:33  [ТС] 14
Вот. Нашел еще кое-что:
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
 public DependencyObject GetTopLevelControl(DependencyObject control)
        {
            DependencyObject tmp = control;
            DependencyObject parent = null;
            if((tmp = VisualTreeHelper.GetParent(tmp)) != null)
            {
                parent = tmp;
            }
            return parent;
        }
 
        public static class NameAttachedProperty
        {
            public static readonly DependencyProperty NameProperty =
                DependencyProperty.RegisterAttached("Name", typeof(string), typeof(NameAttachedProperty), new PropertyMetadata(default(string)));
 
            public static void SetName(DependencyObject element, string value)
            {
                element.SetValue(NameProperty, value);
            }
 
            public static string GetName(DependencyObject element)
            {
                return (string)element.GetValue(NameProperty);
            }
        }
Вставляю в обработчик Click:
C#
1
MessageBox.Show(NameAttachedProperty.GetName(GetTopLevelControl(ButtonName)));
Но функция возвращает пустоту(ничего).
0
Модератор
Эксперт .NET
10447 / 7420 / 2034
Регистрация: 21.04.2018
Сообщений: 22,425
Записей в блоге: 2
11.12.2018, 21:39 15
Цитата Сообщение от asdfg15432 Посмотреть сообщение
Вот. Нашел еще кое-что:
Зачем Вам эти сложности? Мой простой вариант не работает?
0
1 / 1 / 0
Регистрация: 07.04.2015
Сообщений: 273
11.12.2018, 22:20  [ТС] 16
Как раз мне и проще взять готовую функцию и передать ей нужные параметры, чем разбираться в чем-то новом для меня(в силу того, что я не планирую заниматься этим(программированием) часто)
Почему-то я только сейчас понял Ваш код) Идея мне нравится. Но дело в том, что кнопка, в обработчике нажатия которой получается имя Grid не расположена в том самом Grid, в котором находятся большое количество ToggleButton(имя Grid которых я и хочу получить).
0
Модератор
Эксперт .NET
10447 / 7420 / 2034
Регистрация: 21.04.2018
Сообщений: 22,425
Записей в блоге: 2
11.12.2018, 23:04 17
Цитата Сообщение от asdfg15432 Посмотреть сообщение
Почему-то я только сейчас понял Ваш код) Идея мне нравится. Но дело в том, что кнопка, в обработчике нажатия которой получается имя Grid не расположена в том самом Grid, в котором находятся большое количество ToggleButton(имя Grid которых я и хочу получить).
Тогда ... геморрой.
Но DependencyObject - это не выход. Откуда функция будет знать имя какого Grid надо вернуть?

Что такое привязки в XAML знаете? Сможете привязать нужный Grid к Tag кнопки?
0
Почетный модератор
Эксперт С++
5843 / 2853 / 390
Регистрация: 01.11.2011
Сообщений: 6,903
12.12.2018, 12:08 18
Цитата Сообщение от asdfg15432 Посмотреть сообщение
чем разбираться в чем-то новом для меня
Тогда возьмите идею Рядовой из восьмого поста - в отладчике поглядите путь из Parent или TemplateParent для нужного элемента, запишите на бумажку и потом используйте.
0
1 / 1 / 0
Регистрация: 07.04.2015
Сообщений: 273
12.12.2018, 21:55  [ТС] 19
С привязками знаком поверхностно. На данный момент - не смогу. Но примерное представление как это будет выглядеть - имею. Я вижу более простое(мне знакомое) решение(понятно, что не лучшее): сохраняя в файл список всех нажатых кнопок, в начале строки я буду записывать имя Grid, которому эти кнопки принадлежат. А считывая из файла нажатые кнопки, для размещения их в необходимый Grid, буду передавать это слово в качестве аргумента Grid.
0
Модератор
Эксперт .NET
10447 / 7420 / 2034
Регистрация: 21.04.2018
Сообщений: 22,425
Записей в блоге: 2
12.12.2018, 22:47 20
Цитата Сообщение от asdfg15432 Посмотреть сообщение
С привязками знаком поверхностно.
XAML свой сюда скиньте. Не мудрите на пустом месте.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.12.2018, 22:47

PostCreate() выдаёт ошибку во время удаления родительского объекта base.OnDie(prejudicial)
Новый объект создаётся во время удаления существующего объекта - error. Откуда начинать искать...

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

Получить имя устройства на COM-порте
Добрый день. У меня есть несколько экземпляров класса SerialPort. Нужно получить имя устройства,...

Получить имя пользователя по IP-адресу
Возможно ли такое?


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.