私は次のようにしました(バインディングデータソースを使用する場合にのみ機能します)
カスタム datagridview コントロールを作成し、datagridview を継承する
public partial class MyGridView : DataGridView
columnname、summaryvalue、および表示する形式を保持するクラスを宣言します
[Serializable]
public class SummaryDataProperty
{
public string ColumnName { get; set; }
public string Format { get; set; }
internal decimal Value { get; set; }
}
MyDataGridView で集計データ プロパティのリストを宣言する
public List<SummaryDataProperty> SummaryDataPropertyNames { get; set; }
データ バインディングが完了したら、集計を計算し、列ヘッダーに表示します。
protected override void OnDataBindingComplete(DataGridViewBindingCompleteEventArgs e)
{
base.OnDataBindingComplete(e);
if (SummaryDataPropertyNames.Count > 0)
{
if (DataSource is BindingSource)
{
var ds = (DataSource as BindingSource);
foreach (var prop in SummaryDataPropertyNames)
{
prop.Value = 0;
var col = this.Columns[prop.ColumnName];
foreach (var l in ds.List)
{
decimal val;
if (decimal.TryParse(Convert.ToString(l.GetType().GetProperty(col.DataPropertyName).GetValue(l, null)), out val))
prop.Value += val;
}
col.HeaderText = col.HeaderText.Split('[')[0].TrimEnd(' ') + " [" + prop.Value.ToString(prop.Format) + "]";
}
}
}
}
バインディング データ ソースは、データ ソースからのオブジェクトのリストを提供するためです。バインディング ソース リストをループするのは簡単です。オブジェクト datasource または BindingDatasource.Current でこれを行う方法がわかりません。私はまだ解決策を探しています。