基本上我正在使用datagrid的ItemSource属性将通用列表绑定到我的datagrid。但是我真的想改变标题,我尝试了以下但是我得到了一个运行时异常:
dgtest.Columns[1].Header = "edited";
答案 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;
这是它的样子。请注意,列名称不是属性名称(默认行为)。
这种方法稍微有些工作,但是将列标题定义在与绑定列相同的位置是很好的。您可以重新排序列,而无需前往其他位置来修复列名称。
答案 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";
}
}
}