无法在C1 Flexgrid中为未绑定列设置值

时间:2013-12-09 04:01:04

标签: c# componentone c1flexgrid

我目前正在升级使用Flexgrid到V#的Vb6应用程序,其中一个要求是在用户输入数据的绑定数据末尾添加几个动态添加的列。

目前在整个网格上启用了AllowEditing以允许我测试一些东西,并且我发现我能够以编程方式或手动操作数据,如果我正在编辑的列是其中之一绑定列,但是如果我尝试编辑其中一个未绑定的列,它会让我输入值,然后在离开单元格时它会消失。

这是我添加动态列并设置数据的代码:

foreach (var O in Orders)
{
  if (!AddedOrders.Contains(O.L.Order))
  {
    c1FlexGrid1.Cols.Add(2);
    c1FlexGrid1.Cols[c1FlexGrid1.Cols.Count - 2].Caption = "Cus " + (AddedOrders.Count + 1).ToString();
    c1FlexGrid1.Cols[c1FlexGrid1.Cols.Count - 2].Name = "Cus " + (AddedOrders.Count + 1).ToString();
    c1FlexGrid1.Cols[c1FlexGrid1.Cols.Count - 2].DataType = typeof(string);
    c1FlexGrid1.Cols[c1FlexGrid1.Cols.Count - 1].Caption = "Qty " + (AddedOrders.Count + 1).ToString();
    c1FlexGrid1.Cols[c1FlexGrid1.Cols.Count - 1].Name = "Qty " + (AddedOrders.Count + 1).ToString();
    c1FlexGrid1.Cols[c1FlexGrid1.Cols.Count - 1].DataType = typeof(int);

    bool Res = c1FlexGrid1.SetData(1, c1FlexGrid1.Cols.Count - 2, O.C.Company, true);
    c1FlexGrid1.SetData(2, c1FlexGrid1.Cols.Count - 2, O.L.Order, true);
    c1FlexGrid1.SetData(3, c1FlexGrid1.Cols.Count - 2, O.L.Confirmed, true);
    c1FlexGrid1.SetData(4, c1FlexGrid1.Cols.Count - 2, O.L.Variety, true);

    c1FlexGrid1.SetData(1, c1FlexGrid1.Cols.Count - 1 , 0);

    CustCols.Add(c1FlexGrid1.Cols.Count - 2);
    AddedOrders.Add(O.L.Order);
  }
}

我添加的bool是测试函数是否返回true,因此就所关注的代码而言,它似乎成功设置了值。

简而言之 - 如何允许在绑定的Flexgrid中编辑未绑定的列?

1 个答案:

答案 0 :(得分:1)

我最终解决了这个问题,在阅读了关于如何使用未绑定字段的C1非常无益的“示例”后,我将自己的代码放在一起处理它。

由于我使用的是Linq生成的列表,我必须首先将它们转换为数据表,在“FastMember”的帮助下,这使得表生成即时(并且代码非常轻松)。

然后哈希表和get / set事件处理正在加载进出网格的数据,注意不要给任何未绑定的列赋予名称,否则网格将无法呈现:

Hashtable _hash = new Hashtable();

    private static DataTable CreateTable<T>(List<T> List)
    {
        DataTable OutTable = new DataTable();
        using (var reader = ObjectReader.Create(List))
        {
            OutTable.Load(reader);
        }
        return OutTable;
    }

    private void c1FlexGrid1_GetUnboundValue(object sender, C1.Win.C1FlexGrid.UnboundValueEventArgs e)
    {
        DataRowView drv = (DataRowView)c1FlexGrid1.Rows[e.Row].DataSource;

        e.Value = _hash[e.Row.ToString() + "|" + e.Col.ToString()];
    }

    private void c1FlexGrid1_SetUnboundValue(object sender, C1.Win.C1FlexGrid.UnboundValueEventArgs e)
    {
        DataRowView drv = (DataRowView)c1FlexGrid1.Rows[e.Row].DataSource;
        _hash[e.Row.ToString() + "|" + e.Col.ToString()] = e.Value;
    }