Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> получить DataGridColumnHeader из DataGridColumn 
V
    Опции темы
SeregaS
Дата 4.4.2009, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 28.3.2009

Репутация: нет
Всего: нет



У стандартного DataGrid 
у каждой колонки есть свойство Header
по идее оно должно возвращать ссылку на DataGridColumnHeader
однако содержит только имя колонки 
 
и как "выцепить" оттуда DataGridColumnHeader ??

PM MAIL   Вверх
Idsa
Дата 4.4.2009, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 2
Всего: 62



У свойства Header какой тип?


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
SeregaS
Дата 4.4.2009, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 28.3.2009

Репутация: нет
Всего: нет



Header обьект 
но под отладчиком видно что он строка 
foreach (DataGridColumn coll in this.Columns)
            {
               String x = coll.Header.GetType().FullName;// x=  System.String
                
            }
PM MAIL   Вверх
Человек01
Дата 12.4.2009, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 20.2.2009
Где: Абакан, респ. Хак асия, Россия

Репутация: 2
Всего: 2



SeregaS, можно вопрос, в связи с твоим вопросом? Вот загнул... Для какой цели требуется узнать DataGridColumnHeader
Если требуется в динамике изменить визуальное представление Header или же прочитать текущее представление Header то можно проделать такое:
Код

<Window x:Class="test006_DataGrid_columnHeader.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:wpf="clr-namespace:Microsoft.Windows.Controls;assembly=WpfToolkit"
    Title="Window1" Height="300" Width="400">
    <Window.Resources>
        <CollectionViewSource x:Key="collection"/>
    </Window.Resources>
    <Grid>
        <StackPanel>
            <wpf:DataGrid x:Name="datagrid1" DataContext="{StaticResource collection}" ItemsSource="{Binding}"/>
            <Button Click="Button_Click">"выцепляем" DataGridColumnHeader вернее Header и меняем его :)</Button>
        </StackPanel>
    </Grid>
</Window>

Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Data;

namespace test006_DataGrid_columnHeader
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            this.Loaded += new RoutedEventHandler(Window1_Loaded);
        }

        void Window1_Loaded(object sender, RoutedEventArgs e)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("column1", typeof(String));
            dt.Columns.Add("column2", typeof(String));
            dt.Columns.Add("column3", typeof(String));
            dt.Rows.Add(new object[] { "Привет", "раз", "1" });
            dt.Rows.Add(new object[] { "Прювет", "два", "2" });
            dt.Rows.Add(new object[] { "Хайя", "три", "3" });
            dt.Rows.Add(new object[] { "Алоха", "четыре", "4" });
            ((CollectionViewSource)this.Resources["collection"]).Source = dt.DefaultView;
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Button bd=new Button();
            bd.Content="вот ведь";
            datagrid1.Columns[0].Header = bd;
        }
    }
}

В общем пользуемся и говорим Человеку спасибо  smile 
P.S.:Если же требуется провернуть что то другое, то не мог бы ты немного конкретизировать суть вопроса?

PM MAIL ICQ   Вверх
SeregaS
Дата 17.4.2009, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 28.3.2009

Репутация: нет
Всего: нет



мне надо  было к каждой колонке прикрепить контекстное меню 
я решил эту задачу таким образом
меню прикрепляетя при клике на колонку
естевственно один раз при первом клике
а вот то что из колонки сложно получить Неадер это не доработка microsoft
PM MAIL   Вверх
interv
Дата 16.7.2013, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 24.1.2012

Репутация: нет
Всего: 4



Не понял, задача решена? Если нет, то XAML в студию плз.

Самый топорный способ, так сказать на вскидку.

Код

<DataGrid AutoGenerateColumns="False">
      <DataGrid.Resources>
        <Style TargetType="{x:Type DataGridColumnHeader}">
            <Setter Property="ContextMenu">
              <Setter.Value>
                <ContextMenu>
                  <ContextMenu.Style>
                    <Style>
                      <EventSetter Event="ContextMenu.Opened" Handler="HeaderContextMenuOpen" />
                    </Style>
                  </ContextMenu.Style>
                </ContextMenu>
              </Setter.Value>
            </Setter>
          </Style>
      </DataGrid.Resources>
      <DataGrid.Columns>
        <DataGridTextColumn Width="*" Binding="{Binding Path=column1}" Header="Колонка1" />
        <DataGridTextColumn Width="*" Binding="{Binding Path=column2}" Header="Колонка2" />
      </DataGrid.Columns>
</DataGrid>


Код

private void HeaderContextMenuOpen(object sender, RoutedEventArgs e)
    {
      if (sender is ContextMenu)
      {
        ContextMenu menu = sender as ContextMenu;
        menu.Items.Clear();
        if (menu.PlacementTarget is DataGridColumnHeader)
        {
          DependencyObject dO = menu.PlacementTarget;
          while (!(dO is DataGrid) && dO != null)
            dO = VisualTreeHelper.GetParent(dO);
          if (dO is DataGrid)
          {
            //Вот тут у тебя есть 2 переменные
            //DataGridColumnHeader dgch = menu.PlacementTarget as DataGridColumnHeader;
            //DataGrid datagrid = dO as DataGrid;
          }
          else
            e.Handled = !e.Handled;
        }
      }
    }


Это сообщение отредактировал(а) interv - 16.7.2013, 09:29
PM MAIL   Вверх
interv
Дата 16.7.2013, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 24.1.2012

Репутация: нет
Всего: 4



 smile Блин! Не посмотрел на дату, сори са поднимание темы!
PM MAIL   Вверх
dzaraev
Дата 16.7.2013, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 12.1.2013

Репутация: нет
Всего: 1



Цитата(SeregaS @  17.4.2009,  11:26 Найти цитируемый пост)
мне надо  было к каждой колонке прикрепить контекстное меню 
я решил эту задачу таким образом
меню прикрепляетя при клике на колонку


Не самый удобный способ (как и все предложенные).
Предлагаю чисто XAML вариант (каждому хедеру - своё меню).
Если не желаете хранить меню прямо в исходном файле, можете перенести их в другой словарь и свойству Value присвоить значение через StaticReference.
Код

        <DataGrid x:Name="mygrid" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="My Column 1" Binding="{Binding Field1}" Width="*">
                    <DataGridTextColumn.HeaderStyle>
                        <Style TargetType="DataGridColumnHeader">
                            <Setter Property="ContextMenu">
                                <Setter.Value>
                                    <ContextMenu>
                                        <MenuItem Header="Do This from Column ONE"/>
                                        <MenuItem Header="Do That from Column ONE"/>
                                    </ContextMenu>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </DataGridTextColumn.HeaderStyle>
                </DataGridTextColumn>
                <DataGridTextColumn Header="My Column 2" Binding="{Binding Field2}" Width="*">
                    <DataGridTextColumn.HeaderStyle>
                        <Style TargetType="DataGridColumnHeader">
                            <Setter Property="ContextMenu">
                                <Setter.Value>
                                    <ContextMenu>
                                        <MenuItem Header="Do This from Column TWO"/>
                                        <MenuItem Header="Do That from Column TWO"/>
                                    </ContextMenu>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </DataGridTextColumn.HeaderStyle>
                </DataGridTextColumn>
            </DataGrid.Columns>
        </DataGrid>



Цитата(SeregaS @  17.4.2009,  11:26 Найти цитируемый пост)
а вот то что из колонки сложно получить Неадер это не доработка microsoft 

Не соглашусь. DataGridColumnHeader относится по своей природе, и соответственно используется в визуальном дереве, тогда как компоновка интерфейса в ран-тайме осуществляется обычно в логическом дереве. Поэтому, чтобы осуществить такую ран-тайм компоновку в понятиях визуального дерева, приходится прибегать к API визуального дерева, например к VisualTreeHelper.
Подробнее о деревьях WPF тут: http://msdn.microsoft.com/ru-ru/library/ms...(v=vs.100).aspx

Update
Цитата

Блин! Не посмотрел на дату, сори са поднимание темы! 

Нормально, возможно у кого-то схожая проблема ) Желательно, конечно, чтобы отметили как решенный.

Это сообщение отредактировал(а) dzaraev - 16.7.2013, 10:32
--------------------
Если вопрос решён - помечайте тему.  
PM MAIL   Вверх
gambit
Дата 16.7.2013, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: нет
Всего: 40



Отметил как решенный.
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0604 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.