- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 dataGridView1_CellFormatting 对每个列求和。但这使我的 datagridview 在滚动时非常慢。 Especially 当我有大量数据时。
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
Decimal sum = 0, sum2 = 0, sum3 = 0;
for (int i = 0; i < CustomersGrid.Rows.Count; ++i)
{
sum += Convert.ToDecimal(CustomersGrid.Rows[e.RowIndex].Cells[7].Value);
sum2 += Convert.ToDecimal(CustomersGrid.Rows[e.RowIndex].Cells[6].Value);
sum3 += Convert.ToDecimal(CustomersGrid.Rows[e.RowIndex].Cells[8].Value);
}
Quantitytxt.Text = sum2.ToString() + " ";
Sumtxt.Text = string.Format("{0:0.00}", sum).Replace(",", ".") + "€" + " ";
DiscountSumtxt.Text = string.Format("{0:0.00}", sum3).Replace(",", ".") + "€" + " ";
}
有没有更有效的方法呢?仅当我将获得此单元格时才计算总和的示例?或者是否还有其他事件或方法?我也试过这个。
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
Decimal sum = 0, sum2 = 0, sum3 = 0;
for (int i = 0; i < CustomersGrid.Rows.Count; ++i)
{
if (e.ColumnIndex == 7 || e.ColumnIndex == 6 || e.ColumnIndex == 8)
{
sum += Convert.ToDecimal(CustomersGrid.Rows[e.RowIndex].Cells[7].Value);
sum2 += Convert.ToDecimal(CustomersGrid.Rows[e.RowIndex].Cells[6].Value);
sum3 += Convert.ToDecimal(CustomersGrid.Rows[e.RowIndex].Cells[8].Value);
}
}
Quantitytxt.Text = sum2.ToString() + " ";
Sumtxt.Text = string.Format("{0:0.00}", sum).Replace(",", ".") + "€" + " ";
DiscountSumtxt.Text = string.Format("{0:0.00}", sum3).Replace(",", ".") + "€" + " ";
}
它看起来性能好一点,但是当我滚动我的 datagridview 时它仍然很慢。
最佳答案
在documentations中已经提到了:
The CellFormatting event occurs every time each cell is painted, so you should avoid lengthy processing when handling this event. This event also occurs when the cell FormattedValue is retrieved or its GetFormattedValue method is called.
处理 CellFormatting
对于所有单元格来说,计算太多了 Sum
.
如果您使用的是 DataSource
喜欢DataTable
这引发了ListChanged
事件,计算Sum
, 你可以依靠 ListChanged
事件。
作为另一种选择,您可以依赖 RowsAdded
, RowsRemoved
和 CellValueChanged
DataGridView
的事件计算Sum
.
示例 - 数据表 - 列的总和
DataTable
提高 ListChange
事件。您可以订阅更新文本框的事件:
private async void Form1_Load(object sender, EventArgs e)
{
// Define data table
var dt = new DataTable();
dt.Columns.Add("Name");
dt.Columns.Add("Price", typeof(int));
// Fill data
dt.Rows.Add("Product 1", 100);
dt.Rows.Add("Product 2", 200);
// Set data source of data grid view
this.dataGridView1.DataSource = dt;
// Automatically update text box, by SUM of price
textBox1.Text = $"{dt.Compute("SUM(Price)", ""):F2}";
dt.DefaultView.ListChanged += (obj, args) =>
textBox1.Text = $"{dt.Compute("SUM(Price)", ""):F2}";
}
示例 - 列表
List<T>
不提高 ListChanged
事件。您可以使用 BindingSource
作为数据源和句柄 ListChanged
BindingSource
的事件相反:
public class Product
{
public string Name { get; set; }
public int Price { get; set; }
}
private async void Form1_Load(object sender, EventArgs e)
{
// Define list
var list = new List<Product>();
// Fill data
list.Add(new Product { Name = "Product 1", Price = 100 });
list.Add(new Product { Name = "Product 2", Price = 200 });
// Set data source of data grid view
var bs = new BindingSource();
bs.DataSource = list;
this.dataGridView1.DataSource = bs;
// Automatically update text box, by SUM of price
textBox1.Text = $"{list.Sum(x => x.Price):F2}";
bs.ListChanged += (obj, args) =>
textBox1.Text = $"{list.Sum(x => x.Price):F2}";
}
关于c# - 计算总和 - Datagridview CellFormatting 事件性能太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54782726/
我正在使用 C#、Winforms 和 .Net 3.5 我的表单有一个自定义的 DataGridView(双缓冲以防止在我的单元格格式化事件期间闪烁,as seen here)。当我执行数据库搜索时
如何解决 CellFormatting“缓慢滚动”性能问题? 使用此代码将解密值从加密列复制到另一列: private void grid_CellFormatting(object sender,
这是我的代码: public MemoryStream ExportDataTableToExcel(DataTable exportData, string sheetTitle = "Export
我为 DataGridView 上的 CellFormatting 事件添加了一个处理程序,以根据行的内容修改背景颜色。 即使将数据插入表中,它似乎也没有触发。我通过在 IDE 中双击 CellFor
我一直在为 CellFormatting 事件苦苦挣扎,它太慢了。 我有一个像这样的 DataGridView: 我编写了一个函数,当您单击标题中的复选框时会触发该函数,它会选中该列中的所有复选框..
我正在使用 dataGridView1_CellFormatting 对每个列求和。但这使我的 datagridview 在滚动时非常慢。 Especially 当我有大量数据时。 private
我有一个 Datagridview 列,其值为 int。我有一个值状态条件,if(status == 1) 然后将文本更改为 Active,否则将文本更改为 Not Active。 任何帮助将不胜感激
我在使用 Telerik,并且正在尝试格式化列值。列索引号 12 已经指定了颜色(有效),然后我想查找特定值,如果存在则更改单元格颜色。如果单元格值为 4354,则更改单元格颜色....但没有任何反应
我们使用 CellFormatting 事件对应用程序中各个网格中的单元格进行颜色编码。 我们有一些通用代码可以处理导出到 Excel(和打印),但它是黑白的。现在我们要更改此设置并从网格中选取颜色。
我有一个表格如下: with(myTable) { enableCellEditing() columnResizePolicy = SmartResize.POLICY is
在一个简单的 .NET WinForm 中,我有一个 datagridview,它根据单元格的值进行着色。代码正在运行,但呈现的形式“摇摇欲坠”(当计算机不断不得不重新绘制并且无法跟上时的样子)。我想
我是一名优秀的程序员,十分优秀!