0

私は現在、Flexgrid を使用する Vb6 アプリを C# にアップグレードする作業を行っています。要件の 1 つは、ユーザーがデータを入力するバインドされたデータの最後に、いくつかの動的に追加された列を追加することです。

現在、AllowEditing はグリッド全体で有効になっており、いくつかのことをテストできるようになっています。編集している列がバインドされた列の 1 つである場合、グリッド上でプログラムまたは手動でデータを操作できることがわかりました。 、ただし、バインドされていない列の1つを編集しようとすると、値を入力でき、セルを離れるとすぐに消えます。

これは、動的列を追加してデータを設定したコードです。

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 に答える