我正在处理从excel文件源填充的datagridview。
我有一个专栏“时间”。我想在“时间”列中更改单元格的颜色,以便过期的时间(单元格)显示为灰色,下一个可用时间(单元格)为绿色等。
我感觉它比我想象的要复杂,因为在Excel中输入的时间代表了一个日期,即使它目前仅以hh:mm AM / PM格式输入。 DateTime.Now也会调出系统日期+时间。
示例:
现在是11PM(当前时间,此前的任何内容都已过期)。 “时间”列中的单元格具有比当前时间更早和更晚的值。 10:52 PM和ealier现在全部到期,晚上11点50分以后都是可用的时间段。
public Form1()
{
InitializeComponent();
dataGridView1.CellPainting += dataGridView1_CellPainting;
}
///////////////////////////////////
private void loadListBox4()
{
System.Data.OleDb.OleDbConnection MyConnection;
System.Data.DataSet DtSet;
System.Data.OleDb.OleDbDataAdapter MyCommand;
MyConnection = new System.Data.OleDb.OleDbConnection(@"provider=Microsoft.Jet.OLEDB.4.0;Data Source= C:\Users\Dell\Documents\BusTimingExcel.xls;Extended Properties=Excel 8.0;");
MyCommand = new System.Data.OleDb.OleDbDataAdapter("select * from [Sheet1$]", MyConnection);
//MyCommand.TableMappings.Add("Route", "Location");
DtSet = new System.Data.DataSet();
MyCommand.Fill(DtSet);
dataGridView1.DataSource = DtSet.Tables[0];
MyConnection.Close();
dataGridView1.Columns["Time"].DefaultCellStyle.Format = "t";
dataGridView1.AllowUserToAddRows = false;
dataGridView1.AllowUserToDeleteRows = false;
dataGridView1.AllowUserToOrderColumns = true;
dataGridView1.ReadOnly = true; ;
DataView dv;
dv = new DataView(DtSet.Tables[0], "Station = 'Poets Estate, The Dove'", "Time", DataViewRowState.CurrentRows);
dataGridView1.DataSource = dv;
}
}
答案 0 :(得分:2)
您可以尝试向CellPainting
事件处理程序添加代码并在那里更新Cell BackColor
:
private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e){
if(e.Value == null||
e.ColumnIndex < 0 || e.RowIndex < 0 ||
dataGridView1.Columns[e.ColumnIndex].Name!="Time") return;
e.CellStyle.BackColor = ((DateTime)e.Value).TimeOfDay < DateTime.Now.TimeOfDay ?
Color.Gray : Color.Green;
}
//To register the event handler for CellPainting, you can use this code
dataGridView1.CellPainting += dataGridView1_CellPainting;//Place this in your form constructor
要防止闪烁,请尝试使用此代码(放置在表单构造函数中):
typeof(Control).GetProperty("DoubleBuffered", System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance).SetValue(dataGridView1, true, null);
答案 1 :(得分:0)
你在这里没有给我们太多的帮助,但改变网格视图中单元格的颜色可以这样实现:
dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.ForeColor = Color.Red;
现在弄清楚如何检查你的状况(“过期”,“可用”)并调用上面的代码。
希望有所帮助,
克里斯
答案 2 :(得分:0)
如果您想要进一步的帮助告诉我,本规范有效!
private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
if (((System.Windows.Forms.DataGridView)(sender)).Columns.Contains("Time"))
{
int Column_index = ((System.Windows.Forms.DataGridView)(sender)).Columns["Time"].Index;
if ((e.ColumnIndex == Column_index) && (e.RowIndex != -1))
{
DateTime Grid_Time = (DateTime)e.Value;
if (Grid_Time.TimeOfDay < DateTime.Now.TimeOfDay )
{
e.CellStyle.BackColor = Color.Gray;
}
else
{
e.CellStyle.BackColor = Color.Green;
}
}
}
}