Событие AutoGeneratedColumn в Datagrid?

#c# #.net #wpf #datagrid #autogeneratecolumn

#c# #.net #wpf #datagrid #autogeneratecolumn

Вопрос:

Когда я ищу событие AutoGeneratedColumn, это все, что я получаю.

Если для свойства AutoGenerateColumns установлено значение true, событие AutoGeneratingColumn вызывается для каждого созданного столбца. Это событие произойдет, когда будут созданы все столбцы.

Событие AutoGeneratedColumns вызывается каждый раз, когда DataGrid пытается сгенерировать столбцы. Например, AutoGeneratedColumns вызывается при инициализации DataGrid, AutoGenerateColumns имеет значение true или изменяется ItemsSource, даже если ItemsSource имеет значение null. Это событие происходит, когда процесс автозаполнения завершается DataGrid.

По этому событию свойство Datagrid Columns заполняется сгенерированными столбцами, и вы можете изменить любой сгенерированный столбец, указав индекс для свойства Columns.

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

Пример Я попытался использовать AutoGeneratedTrigger в простом приложении. Но я застрял. Я хочу добавить некоторую логику в функцию Auto, поэтому я создал текстовый блок и привязал его к свойству Text, которое я инициализирую в функции Auto, которая будет запускаться при запуске события AutoGeneratedColumn. Но свойство Text не сохраняет никакого значения.

Код Xaml

 <Grid>
        <StackPanel Orientation="Vertical">
            <DataGrid x:Name="DG" Width="400" AutoGenerateColumns="True" ItemsSource="{Binding emp,Mode=TwoWay}">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="AutoGeneratedColumn">
                        <i:InvokeCommandAction Command="{Binding CmdAuto}"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </DataGrid>
            <TextBlock Name="MyTextBlock" Text="{Binding Text,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" Width="200" Background="Aqua" Height="100"></TextBlock>
        </StackPanel>
    </Grid>
  

Код класса

 public class Employees:ViewModelPropertyChanged
    {
        private ObservableCollection<Emp> _emp;

        public ObservableCollection<Emp> emp
        {
            get { return _emp; }
            set
            {
                _emp = value; OnPropertyChange("emp");
            }
        }
        public Employees ()
        {
             emp = new ObservableCollection<Emp>();
             emp.Add(new Emp { ID = 1, Name = "Kapil Malhotra", IsMale = true, Type = EmployeeType.Normal, SiteID = new Uri("http://localhost/4322"), BirthDate = new DateTime(1980, 1, 1) });
             emp.Add(new Emp { ID = 2, Name = "George", IsMale = true, Type = EmployeeType.Manager, SiteID = new Uri("http://localhost/4432"), BirthDate = new DateTime(1980, 2, 1) });
        }
        private string _Text;

        public string Text
        {
            get { return _Text; }
            set { _Text = value;
                OnPropertyChange("Text");
            }
        }

        public ICommand Cmdauto
        {
            get
            {
                return new DelegateCommand<object>(Auto);
            }
        }

        private void Auto(object obj)
        {
          
            //logic
            //Text ="Data Uploaded";
        }

    }
    public class Emp
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public bool IsMale { get; set; }
        public EmployeeType Type { get; set; }
        public Uri SiteID { get; set; }
        public DateTime BirthDate { get; set; }
    }
    public enum EmployeeType
    {
        Normal,
        Supervisor,
        Manager
    }
}
  

Комментарии:

1. После запуска события AutoGeneratingColumn для каждого отдельного такого столбца запускается одно событие AutoGeneratedColumns, уведомляющее об окончании автоматической генерации столбцов. Вы пытались присоединить обработчики к обоим событиям, чтобы посмотреть, что происходит во время выполнения?

2. Нет, у меня нет, но я попробую это.

3. @Clemens пожалуйста, посмотрите пример и помогите.

Ответ №1:

AutoGenerateColumns действительно полезно во многих сценариях. И это событие OnAutoGeneratingColumn дает вам контроль над тем, как вы хотите, чтобы столбцы были сгенерированы. Итак, теперь, хотя столбцы генерируются автоматически, но вы контролируете ситуацию.

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

Форматирование текста заголовка, форматирование привязок, включая или исключая создаваемые столбцы (поскольку по умолчанию все столбцы генерируются автоматически для всех свойств), а также управление их индексом отображения и шириной столбцов. Итак, это один из способов, которым вы можете его использовать. Надеюсь, вы поняли идею.

 private void DataGridAnything_OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{

    try
    {
        var existsCol = IncludeColumnsList.FirstOrDefault(x => x.IncludingColumnName.ToLower() == e.Column.Header.ToString().ToLower());

        if (existsCol == null)
        {
            e.Cancel = true;
            return;
        }

        if (existsCol.IncludingColumnName.Contains("Date") amp;amp; e.PropertyType == typeof(DateTime))
        {
            (e.Column as DataGridTextColumn).Binding.StringFormat = "dd/MM/yyyy";
        }
        else if (existsCol.IncludingColumnName.Contains("Time") amp;amp; e.PropertyType == typeof(TimeSpan))
        {
            (e.Column as DataGridTextColumn).Binding.StringFormat = "hh\:mm\:ss";
        }



        e.Column.DisplayIndex = existsCol.DisplayIndex;
        e.Column.Width = new DataGridLength(0,DataGridLengthUnitType.Auto);
        e.Column.Header = AddSpacesToSentence(e.Column.Header.ToString());
    }
    catch (Exception ex)
    {
        Intelli.ShowIntelliMessage(ex.Message, ex.ToString(), "Close");
        Log.Error(ex, "");
    }

}
  

Комментарии:

1. Мой вопрос был для AutoGeneratedColumn, а не для AutoGeneratingColumn.

2. Но ваш ответ также весьма полезен для понимания AutoGeneratingColumn

3. О, да, но я думаю, у вас возникла идея, что аналогичным образом вы можете использовать AutoGeneratedColumn event.