0

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

目前在整个网格上启用了 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 中编辑未绑定的列?

4

1 回答 1

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;
    }
于 2013-12-29T23:30:10.787 回答