在DataGrid中显示行号

我们通常会碰到在DataGird的第一列(或某一列)自动显示该行行号的需求,如下图

image

分析这个问题我们需要两步走

  • 向数据源添加数据时自动显示行号
  • 从数据源删除数据时自动更新所有行号

 

首先做一些准备工作,我们需要为DataGird自定义第一列的单元格

<data:DataGridTemplateColumn>
    <data:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock />
        </DataTemplate>
    </data:DataGridTemplateColumn.CellTemplate>
</data:DataGridTemplateColumn>

 

很简单,一个TextBlock而已

再搞出一个实体类

public class Person {
        public string FullName { get; set; }
        public int? Age { get; set; }
        public string Gender { get; set; }
    }

 

接着定义一个私有变量_personList并在初始化时为其添加几项以便测试。

注:_personList是ObservableCollection,以下我们所有的操作都基于ObservableCollection。

ObservableCollection<Person> _personList;

 

_personList = new ObservableCollection<Person> { 
                new Person(){ FullName="forever",Age=13,Gender="男" },
                new Person(){ FullName="fish",Age=14,Gender="公"},
                new Person(){ FullName="SBPP",Age=40,Gender="男"},
                new Person(){FullName="TNT",Age=null,Gender="男"},
                new Person(){FullName="SARS",Age=5,Gender="无"},
            };

 

 

接着我们开始解决第一个问题,即添加数据时自动显示数据行号:

假设我们有一个按钮用来向数据源中插入数据,如

private void btnAdd_Click(object sender, RoutedEventArgs e) {
            _personList.Add(new Person() { FullName = "Lulu", Age = 18, Gender = "女" });
        }

 

为了让每一行的第一列产生自动编号,我们需要捕获dataGrid1的LoadingRow事件,如

dataGrid1.LoadingRow += new EventHandler<DataGridRowEventArgs>(dataGrid1_LoadingRow);

 

void dataGrid1_LoadingRow(object sender, DataGridRowEventArgs e) {
    int index = e.Row.GetIndex();
    var cell = dataGrid1.Columns[0].GetCellContent(e.Row) as TextBlock;
    cell.Text = (index + 1).ToString();
}

F5运行后点击增加按钮,你会发现数据源中新增的数据已经加入到DataGrid的新行中,并且第一列自动显示了该行的行号。

现在我们开始解决第二个问题,即从数据源删除数据时自动更新所有行号

现在GridView中再自定义一列,每列的显示一个按钮用来删除该条数据

<data:DataGridTemplateColumn>
    <data:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Button Content="删除" Click="btnDel_Click" />
        </DataTemplate>
    </data:DataGridTemplateColumn.CellTemplate>
</data:DataGridTemplateColumn>

 

然后在.cs中处理btnDel_Click事件

private void btnDel_Click(object sender, RoutedEventArgs e) {
    var btn = sender as Button;
    var index = _personList.IndexOf(btn.DataContext as Person);
    _personList.RemoveAt(index);
    foreach (var item in dataGrid1.ItemsSource) {
        var txtBlock = dataGrid1.Columns[0].GetCellContent(item) as TextBlock;
        txtBlock.Text = (DataGridRow.GetRowContainingElement(txtBlock).GetIndex() + 1).ToString();
    }
}

ok,大功告成。

如果您有更好的方法,请告诉我,多谢。

转载于:https://www.cnblogs.com/junbird-nest/archive/2012/04/09/2439444.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值