使用单元格绘画显示数据网格视图值 0 和空时出现问题



https://prnt.sc/ou2tvv

嗨,对不起,我没有太多经验。 我找到了一个代码。 为此,我添加了数据表,为空。 当我运行它时,它不会在数据网格视图中显示值。 我在网络上找到的代码不适用于 null 和 0 值。 谁能帮我解决这个问题。 感谢您的帮助。



namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private StringFormat m_sf;
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
dataGridView1.Refresh();
}
private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
if (e.RowIndex < 0)
return;
if (e.ColumnIndex < 0)
return;
if (dataGridView1.Rows[e.RowIndex].IsNewRow)
return;
if (dataGridView1.Columns[e.ColumnIndex].Name == "pct")
{
e.Handled = true;
LinearGradientBrush brocha;
decimal max = dataGridView1.Rows.Cast<DataGridViewRow>().Max(dr => System.Convert.ToDecimal(dr.Cells["total"].Value));
decimal val = System.Convert.ToDecimal(dataGridView1.Rows[e.RowIndex].Cells["total"].Value);
Rectangle r = e.CellBounds;
r.Width = System.Convert.ToInt32(r.Width * val / (decimal)max);
if (r.Width > 0)
{
brocha = new LinearGradientBrush(r, Color.WhiteSmoke, Color.Green, 90);
e.Graphics.FillRectangle(Brushes.WhiteSmoke, e.CellBounds);
e.Graphics.FillRectangle(brocha, r);
}
e.Graphics.DrawString(System.Convert.ToInt32(val).ToString(), Font, Brushes.Black, e.CellBounds, m_sf);
}
}
private void Form1_Load(object sender, EventArgs e)
{
DataTable dgv1 = GetTable();
dataGridView1.DataSource = dgv1;
dataGridView1.Columns.Add("total", "Total");
dataGridView1.Columns["total"].ValueType = typeof(decimal);
dataGridView1.Columns.Add("pct", "Porcentaje");
dataGridView1.Columns["pct"].ReadOnly = true;
m_sf = new StringFormat() { Alignment = StringAlignment.Far, LineAlignment = StringAlignment.Center };
}
static DataTable GetTable()
{
DataSet ds = new DataSet();
DataTable dgv1 = new DataTable();
ds.Tables.Add(dgv1);
for (int i = 1; i < 100; i++)
{
dgv1.Rows.Add();
}
return dgv1;
}
}
}

https://prnt.sc/ou2v65

如果数据网格视图具有值,则代码有效,但如果存在 null 或零值,则代码不能正常工作。

如果数据网格视图有值,则代码有效,但如果存在空值或零值,则代码不能正常工作。

以下代码将产生DivideByZeroException,因为当没有行或其最大值为 0 时max为 0:

r.Width = System.Convert.ToInt32(r.Width * val / (decimal)max);

相关内容

  • 没有找到相关文章

最新更新