WPF - 更改绑定数据表格上的列名

7

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

dgtest.Columns[1].Header = "edited";
4个回答

20

我使用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;

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

具有重命名列的数据网格

这种方法需要更多的工作,但在绑定列的同一位置定义列标题很好。您可以重新排序列,而无需去其他地方修复列名。


1
非常好!不过,在声明desc之后,您可以简化第三个代码块:如果(desc.Attributes [typeof (ColumnNameAttribute)]是ColumnNameAttribute att),则e.Column.Header = att.Name; - MattE

6
你可以在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.";

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

3

WPF中的AutoGeneratedColumns事件用于更改列名

datagrid1.AutoGeneratedColumns += datagrid1_AutoGeneratedColumns;

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

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";
    }
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接