Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用CellPaint显示datagridview值0和null时出现问题_C#_Datagridview_Null_Zero - Fatal编程技术网

C# 使用CellPaint显示datagridview值0和null时出现问题

C# 使用CellPaint显示datagridview值0和null时出现问题,c#,datagridview,null,zero,C#,Datagridview,Null,Zero,嗨,对不起,我没有多少经验。 我找到一个密码。 为此,我添加了datatable,empty。 当我运行它时,它不会在datagridview中显示值。 我在web上找到的代码对于null和0值不起作用。 有人能帮我吗。 谢谢你的帮助 namespace WindowsFormsApplication2 { public partial class Form1 : Form { public Form1() { In

嗨,对不起,我没有多少经验。 我找到一个密码。 为此,我添加了datatable,empty。 当我运行它时,它不会在datagridview中显示值。 我在web上找到的代码对于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;
        }
    }
}



命名空间Windows窗体应用程序2
{
公共部分类Form1:Form
{
公共表格1()
{
初始化组件();
}
私有格式m_sf;
私有void dataGridView1_CellEndEdit(对象发送方,DataGridViewCellEventArgs e)
{
dataGridView1.Refresh();
}
私有void dataGridView1_CellPainting(对象发送方,DataGridViewCellPaintingEventArgs e)
{
如果(e.RowIndex<0)
返回;
如果(例如,列索引<0)
返回;
if(dataGridView1.Rows[e.RowIndex].IsNewRow)
返回;
如果(dataGridView1.Columns[e.ColumnIndex].Name==“pct”)
{
e、 已处理=正确;
线蕨;
decimal max=dataGridView1.Rows.Cast().max(dr=>System.Convert.ToDecimal(dr.Cells[“total”].Value));
decimal val=System.Convert.ToDecimal(dataGridView1.Rows[e.RowIndex].Cells[“total”].Value);
矩形r=e.CellBounds;
r、 宽度=系统转换为32(r.Width*val/(十进制)最大值);
如果(r.宽度>0)
{
brocha=新的LinearGradientBrush(r,Color.WhiteSmoke,Color.Green,90);
e、 图形。填充矩形(画笔。白烟,e。单元格边界);
e、 图形.圆角矩形(brocha,r);
}
e、 Graphics.DrawString(System.Convert.ToInt32(val.ToString()、字体、画笔、黑色、e.CellBounds、m_sf);
}
}
私有void Form1\u加载(对象发送方、事件参数e)
{
DataTable dgv1=GetTable();
dataGridView1.DataSource=dgv1;
dataGridView1.Columns.Add(“总计”、“总计”);
dataGridView1.列[“总计”]。ValueType=typeof(十进制);
dataGridView1.Columns.Add(“pct”、“Porcentaje”);
dataGridView1.Columns[“pct”]。只读=true;
m_sf=new StringFormat(){Alignment=StringAlignment.Far,LineAlignment=StringAlignment.Center};
}
静态数据表GetTable()
{
数据集ds=新数据集();
DataTable dgv1=新DataTable();
ds.Tables.Add(dgv1);
对于(int i=1;i<100;i++)
{
dgv1.Rows.Add();
}
返回dgv1;
}
}
}

如果datagridview有值,代码就可以工作,但是如果有null或零值,代码就不能正常工作

如果datagridview有值,代码就可以工作,但是如果有null或零值,代码就不能正常工作

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

r.Width=System.Convert.ToInt32(r.Width*val/(十进制)max);

我附加了一个图像链接,我不知道这是否允许。你需要这样做
e.Handled=true也在其他if块中。添加一个
null
0
检查:
如果(val!=null&&val!=0){…绘制你的东西}
-当前如果
r.Width
为0,它将不会做任何事情,如果
val
为0。对不起,在你说的哪个块中?非常感谢大家的帮助,我将使用另一个代码,我会努力适应它。