q406157290 发表于 2015-9-2 15:40:00

c1FlexGrid 新追加的行

1.c1FlexGrid 新规追加的行如何等到新追加的行的行和列的索引
怎么能把新追加的行 和已有的行区分开来
2.当新追加行时 会触发CellFactory吗?
3. 如何实现新追加行的单元格的内容和寄存的不一样(如: 某列是Text列 ,想新追加行的该列是ComboBox)
谢谢

Alice 发表于 2015-9-2 18:41:00

回复 1楼q406157290的帖子

谢谢反馈。
1.通过AllowAddNew设置为true,就会出现一个新行。新行就是最后一行。即flexgrid.rows.count-1就是新行的索引。
新行的行头会有一个*符号,和其他行不一致,我不太清楚你是想如何区分?
2.你的意思是想问,你通过新行添加到C1FlexGrid的行,会不会按照CellFactory绘制?会的。

3.不知道你是不是想要这样的效果?
http://our.componentone.com/wp-content/uploads/2013/03/screenshot11.png
通过CellFactory可以实现。
代码参考:
public class MyCellfactroy : C1.WPF.FlexGrid.CellFactory
{
    public override void CreateCellContent(C1.WPF.FlexGrid.C1FlexGrid grid, Border bdr, C1.WPF.FlexGrid.CellRange rng)
    {
      base.CreateCellContent(grid, bdr, rng);
      if (rng.Row > -1 && rng.Column > -1)
            if (grid.Rows.Index == 0 && grid.Columns.Index == grid.Columns.Count - 1)
            {
                var _btn = new Button();
                _btn.Content = "button";
                bdr.Child = _btn;
            }
    }
}


然后
c1FlexGrid1.CellFactory = new MyCellfactroy();

q406157290 发表于 2015-9-6 08:32:00

回复 2楼Alice的帖子

首先谢谢您的回复
1 我说的区分是在代码中做区分到底是普通的绑定行 还是新追加的行
2 您给我的效果不是我想要的效果,您现在的这种实现当没有数据的时候,新追加的行Title列也会显示出button来,这样就不太符合我们的要求了,我们想要的是 只有在点击新规行后才出现c1ComboBox或者Button控件
还有个问题 就是新规行的时候当往单元格输入内容或者是进入编辑状态的时候 新规行就提交成普通的行了 能否实现当按Enter才让它变成普通行吗?而不是一编辑就变化能否控制,这个问题真的很着急,希望能快快有答复,谢谢

Alice 发表于 2015-9-6 11:16:00

回复 3楼q406157290的帖子

谢谢反馈。
1.如果你获取的行是新行,它的类型是C1.WPF.C1FlexGrid.NewRowTemplate。如果是绑定行,它的类型是C1.WPF.C1FlexGrid.BoundRow。
Row newrow=flexgrid.Rows;
if(newrow is NewRowTemplate)
{
Console.Writeline("new row");
}
2.很抱歉不能。
新行仅仅是一个模板,它不含有任何数据,也不代表数据源里的任何项目。目前的设计是,一进入编辑状态,它就会立即生成一行,会触发相关事件,这个行和数据源相关,你可以在这行进行编辑,并且存储到数据源。

KNight 发表于 2015-9-6 21:27:00

回复 3楼q406157290的帖子

第二个问题我提供一个参考解决方法,具体还是要看您的业务数据如何处理;
参考代码如下:
private void flex_RowEditEnding(object sender, CellEditEventArgs e)
{
        if (e.Row == -1)// 处理在新行中开始编辑
        {
                flex.AllowAddNew = false;
        }
}

private void flex_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
{
        if (e.Key == System.Windows.Input.Key.Enter)// 按Enter键后从新允许添加新行
        {
                flex.AllowAddNew = true;
                flex.UpdateLayout();
        }
}
这种实现从界面上很直观,但是实际上最后一行数据还是在绑定数据源对象里实例化了,所以在最后的最后,可以根据此时flex的状态(AllowAddNew)来处理最后一行数据,如果状态AllowAddNew为True,则最后一行数据有效,否则处理掉最后一行数据;

q406157290 发表于 2015-9-7 08:19:00

回复 5楼KNight的帖子

谢谢您我稍后会试下 非常感谢

Alice 发表于 2015-9-7 13:43:00

回复 6楼q406157290的帖子

谢谢反馈。
页: [1]
查看完整版本: c1FlexGrid 新追加的行