关于datagridview排序后字体颜色丢失问题

来源:互联网 发布:3dmax2012沙发材质数据 编辑:程序博客网 时间:2024/04/29 01:45

如题,在获取DataTable后,跟住每行中的特定字段判断,如果符合要求,则这行字体设为灰色。

1、开始的时候用了简单的datagridview.datasours绑定,如下:(注意:datagridview在下面用dg代替)

dg.DataSource = dt;for (int i = 0; i < dg.Rows.Count; i++) {     if (dg.Rows[i].Cells["d_id"].Value.ToString() == "Y")    {            this.dg.Rows[i].DefaultCellStyle.ForeColor = System.Drawing.Color.Gray;    }    else            this.dg.Rows[i].DefaultCellStyle.ForeColor = System.Drawing.Color.Blue;}

但是点击datagridview每一列的列头进行排序,颜色就会丢失。


然后在网上查找资料,不绑定datagridview.datasours,帮数据格式也传递过去的方法。

将上面dg.DataSource = dt;
改成dtToDgv(dg, dt, 1);//调用下面的函数

public static void dtToDgv(DataGridView dgv, DataTable dt, int needDgvClear)        {            //直接等于数据源的方法传1;重置的传0;追加时传2;重置为空,则传3            if (dgv == null)            {                return;            }            if (needDgvClear == 3)            {                dgv.Rows.Clear();                dgv.Columns.Clear();                return;            }            if (dt != null && dt.Rows != null && dt.Rows.Count >= 0)            {                switch (needDgvClear)                {                    case 0:                        dgv.Rows.Clear();                        dgv.Columns.Clear();                        for (int i = 0; i < dt.Columns.Count; i++)                        {                            string columnName2 = dt.Columns[i].ColumnName;//DataTable的列名                            dgv.Columns.Add(columnName2, columnName2);                            dgv.Columns[columnName2].ValueType = dt.Columns[i].DataType;//把DataTable列的数据类型传进来                        }                        return;                    case 1:                        dgv.Rows.Clear();                        dgv.Columns.Clear();                        break;                    case 2:                        break;                    default:                        dgv.Rows.Clear();                        dgv.Columns.Clear();                        break;                }                if (needDgvClear == 2)                {                    if (dgv.Columns == null || dgv.Columns.Count < 1)                    {//追加时,如果原有的数据源本身就是空的,则还是要绘制表头                        for (int i = 0; i< dt.Columns.Count; i++)                        {                            string columnName2 = dt.Columns[i].ColumnName;//DataTable的列名                            dgv.Columns.Add(columnName2, columnName2);                            dgv.Columns[columnName2].ValueType = dt.Columns[i].DataType;//把DataTable列的数据类型也传进来                        }                    }                }                else                {                    for (int i = 0; i < dt.Columns.Count; i++)                    {                        string columnName2 = dt.Columns[i].ColumnName;                        dgv.Columns.Add(columnName2,columnName2);                        dgv.Columns[columnName2].ValueType = dt.Columns[i].DataType;                    }                }                for (int j = 0; j < dt.Rows.Count; j++)                {                    dgv.Rows.Add();                    for (int f = 0; f < dgv.Columns.Count; f++)                    {                        string dgvColumnName_ = dgv.Columns[f].HeaderText;                        dgv[dgvColumnName_, dgv.Rows.Count - 1 - (dgv.AllowUserToAddRows ? 1 : 0)].Value = dt.Rows[j][dgvColumnName_];                    }                }            }        }
但问题是,我想实现datagridview的_MouseDoubleClick功能,而这个方法并没有进行数据的绑定,即没有dg.DataSource=dt;这一步,所以后续操作比较麻烦。


3、最后决定用_DataBindingComplete修改颜色

private void dg_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)        {            DataGridView curDgv = (DataGridView)sender;            foreach (DataGridViewRow Row in curDgv.Rows) {                if (Row != null) {                    foreach (DataGridViewCell cell in Row.Cells) {                        if (curDgv.Columns[cell.ColumnIndex].DataPropertyName.Equals("d_id")) {                            if (cell.Value.ToString().Equals("Y"))                            {                                Row.DefaultCellStyle.ForeColor = Color.Gray;                            }                            else {                                Row.DefaultCellStyle.ForeColor = Color.Blue;                            }                        }                    }                }            }        }

这样,既能使得排序的时候颜色不丢失,又能在_MouseDoubleClick的时候实现数据传递,不用再查询一次数据库。






原创粉丝点击