首页 > 解决方案 > Datagrid中的AutoGeneratedColumn事件?

问题描述

当我搜索 AutoGeneratedColumn 事件时,这就是我得到的全部。

如果 AutoGenerateColumns 属性设置为 true,则为创建的每个列引发 AutoGeneratingColumn 事件。创建所有列后,将发生此事件。

每次 DataGrid 尝试生成列时都会引发 AutoGeneratedColumns 事件。例如,在初始化 DataGrid、AutoGenerateColumns 设置为 true 或更改 ItemsSource 时引发 AutoGeneratedColumns,即使 ItemsSource 为空也是如此。当 DataGrid 完成自动完成过程时,会发生此事件。

通过此事件,Datagrid Columns 属性将填充生成的列,您可以通过为 Columns 属性提供索引来修改任何生成的列。

我的问题是这个事件有什么用,我该如何使用这个事件。任何人都可以举一个例子,比如我如何使用这个事件访问列,我可以用这个来改变什么?

示例 我尝试在一个简单的应用程序中使用 AutoGeneratedTrigger。但我被困住了。我想在 Auto 函数中添加一些逻辑,因此我创建了一个文本块并与我在 Auto 函数中初始化的 Text 属性绑定,该函数将在 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
    }
}

标签: c#.netwpfdatagridautogeneratecolumn

解决方案


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") && e.PropertyType == typeof(DateTime))
        {
            (e.Column as DataGridTextColumn).Binding.StringFormat = "dd/MM/yyyy";
        }
        else if (existsCol.IncludingColumnName.Contains("Time") && 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, "");
    }

}

推荐阅读