WPF - 更改Data Bound DataGrid上的列名

时间:2010-08-10 16:44:56

标签: c# wpf datagrid

基本上我正在使用datagrid的ItemSource属性将通用列表绑定到我的datagrid。但是我真的想改变标题,我尝试了以下但是我得到了一个运行时异常:

dgtest.Columns[1].Header = "edited";

4 个答案:

答案 0 :(得分:14)

我使用了AutoGeneratingColumn事件和一个属性来设置列名。

首先创建一个属性类......

    public class ColumnNameAttribute : System.Attribute
    {
        public ColumnNameAttribute(string Name) { this.Name = Name; }
        public string Name { get; set; }
    }

然后我用新属性装饰我的数据类成员......

    public class Test
    {
        [ColumnName("User Name")]
        public string Name { get; set; }
        [ColumnName("User Id")]
        public string UserID { get; set; }
    }

然后我编写AutoGeneratingColumn事件处理程序......

    void dgPrimaryGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        var desc = e.PropertyDescriptor as PropertyDescriptor;
        var att = desc.Attributes[typeof(ColumnNameAttribute)] as ColumnNameAttribute;
        if(att != null)
        {
            e.Column.Header = att.Name;
        }
    }

...并将其附加到我的网格并测试......

        dgPrimaryGrid.AutoGeneratingColumn += dgPrimaryGrid_AutoGeneratingColumn;

        var data = new object[] 
        {
            new Test() { Name = "Joe", UserID = "1" }
        };
        dgPrimaryGrid.ItemsSource = data;

这是它的样子。请注意,列名称不是属性名称(默认行为)。

A DataGrid with Columns Renamed

这种方法稍微有些工作,但是将列标题定义在与绑定列相同的位置是很好的。您可以重新排序列,而无需前往其他位置来修复列名称。

答案 1 :(得分:3)

您可以在ItemDataBound事件中更改它:

public void yourDataGrid_OnItemDataBound(object s, DataGridItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Header)
    {
        // Change the cell index to the column index you want... I just used 0
        e.Item.Cells[0].Text = "Text you want in header.";
    }
}

如果网格已经绑定,您应该能够:

yourDataGrid.Columns[0].Header = "Text you want in header.";

您可能会收到错误,因为您试图在文本绑定之前更改文本。

答案 2 :(得分:3)

wpf上的AutoGeneratedColumns事件用于更改列名

datagrid1.AutoGeneratedColumns += datagrid1_AutoGeneratedColumns;

void datagrid1_AutoGeneratedColumns(object sender, EventArgs e)
{
    datagrid1.Columns[0].Header = "New Column Name";
}

答案 3 :(得分:0)

1)关闭自动列生成功能,并在程序代码中生成数据网格列:

DataGridTextColumn TempColumn;    

MyDataGrid.AutoGenerateColumns = false;

TempColumn = new DataGridTextColumn();
TempColumn.Header = "DisplayName0";
TempColumn.Binding = new Binding("BindingName0");
MyDataGrid.Columns.Add(TempColumn);

TempColumn = new DataGridTextColumn();
TempColumn.Header = "DisplayName1";
TempColumn.Binding = new Binding("BindingName1");
MyDataGrid.Columns.Add(TempColumn);

然后,“ BindigName0”是列0的内部绑定名称,“ DisplayName0”是用户将看到的名称。

2)如果要使用自动列生成,则可以在“ AutoGeneratingColumn”事件中设置列的显示名称:

MyDataGrid.AutoGeneratingColumn += MyDataGrid_AutoGeneratingColumn;

...

private void MyDataGrid_AutoGeneratingColumn(object sender, 
              DataGridAutoGeneratingColumnEventArgs e)
{
  DataGridBoundColumn TempColumn;
  string BindingName;

  if (e.Column is DataGridBoundColumn)
  {
    TempColumn = e.Column as DataGridBoundColumn;
    BindingName = (TempColumn.Binding as Binding).Path.Path;
    if (BindingName == "BindingName0")
    {
      TempColumn.Header = "DisplayName0";
    }
    else if (BindingName == "BindingName1")
    {
      TempColumn.Header = "DisplayName1";
    }
  }
}