Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.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# 如何根据两个单元格中的值在DataGridView中绘制选定行?_C#_Winforms_Datagridview_Datagridviewcolumn_Paintevent - Fatal编程技术网

C# 如何根据两个单元格中的值在DataGridView中绘制选定行?

C# 如何根据两个单元格中的值在DataGridView中绘制选定行?,c#,winforms,datagridview,datagridviewcolumn,paintevent,C#,Winforms,Datagridview,Datagridviewcolumn,Paintevent,我使用分号分隔的文本文件填充DataGridView,如下所示: private void ExistingAppntmntRecs_Load(object sender, EventArgs e) { DataTable dt = SeparatedValsFileToDataTable(APPOINTMENTS_FILE_NAME, ";"); dataGridViewExistingAppntmntRecs.DataSource = dt; } // from http:

我使用分号分隔的文本文件填充DataGridView,如下所示:

private void ExistingAppntmntRecs_Load(object sender, EventArgs e)
{
    DataTable dt = SeparatedValsFileToDataTable(APPOINTMENTS_FILE_NAME, ";");
    dataGridViewExistingAppntmntRecs.DataSource = dt;
}

// from http://stackoverflow.com/questions/39434405/read-csv-to-datatable-and-fill-a-datagridview (Frank)
public static DataTable SeparatedValsFileToDataTable(string filename, string separatorChar)
{
    var table = new DataTable("Filecsv");
    using (var sr = new StreamReader(filename, Encoding.Default))
    {
        string line;
        var i = 0;
        while (sr.Peek() >= 0)
        {
            try
            {
                line = sr.ReadLine();
                if (string.IsNullOrEmpty(line)) continue;
                var values = line.Split(new[] { separatorChar }, StringSplitOptions.None);
                var row = table.NewRow();
                for (var colNum = 0; colNum < values.Length; colNum++)
                {
                    var value = values[colNum];
                    if (i == 0)
                    {
                        table.Columns.Add(value, typeof(String));
                    }
                    else
                    { row[table.Columns[colNum]] = value; }
                }
                if (i != 0) table.Rows.Add(row);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            i++;
        }
    }
    return table;
}
以下是读取的文件内容(虚假/测试数据,带有标题行):

如果adEndMonth+adEndYear日期等于2个月或更短时间,则整行应为黄色;如果1个月或更短,橙色;如果是今天还是过去,把它涂成红色。最后,如果某个滚石乐队正在运行该应用程序,请将其涂成黑色

以下是一些用于延迟事件的伪代码,其中包含“TODO:”我不知道该怎么做:

private void dataGridViewExistingAppntmntRecs_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
    DateTime twoMonthsLimit = DateTime.Now.AddMonths(2);
    DateTime oneMonthLimit = DateTime.Now.AddMonths(1);
    int endYear = // TODO: assign adEndYear value
    int endMonth = // TODO: assign adEndMonth value
    DateTime endDate = new DateTime(endYear, endMonth, 1);
    if (twoMonthsLimit > endDate) // TODO: paint row yellow
    if (oneMonthLimit > endDate) // TODO: paint row orange
    if (endDate < DateTime.Now) // TODO: paint row red
}
private void dataGridViewExistingAppntmntRecs_RowPostPaint(对象发送方,DataGridViewRowPostPaintEventArgs e)
{
DateTime twoMonthsLimit=DateTime.Now.AddMonths(2);
DateTime one monthlimit=DateTime.Now.AddMonths(1);
int endYear=//TODO:分配adEndYear值
int endMonth=//TODO:分配adEndMonth值
DateTime endDate=新的日期时间(endYear,endMonth,1);
如果(两个月限制>结束日期)//TODO:将行涂成黄色
if(oneMonthLimit>endDate)//TODO:将行绘制为橙色
if(endDate
如果目标过于简单,请突出显示特定日期内的行,然后更改行的背景色可能是一个更简单的选择。可能不需要重新绘制行。我的解决方案只是根据“endMonth”和“endYear”列中的日期更改行的背景颜色

单元格格式是一个选项,但是,它会经常触发,并且在每次更改或显示单元格时都进行此“着色”检查是不必要的。如果行已经“着色”,那么唯一需要查找的是添加新行或更改“endMonth”或“endYear”列中的值

下面的代码只是在
DataGridView
中循环,并根据您描述的条件设置每一行的颜色。获取行颜色的逻辑相当简单(减去将其绘制为黑色)。如果日期比今天的日期提前两个月,则将背景颜色保留为白色。如果日期大于1个月但小于2个月,则将行涂成黄色…等等

我使用类似的方法读取文本文件并创建数据表。希望这有帮助

DataTable dt;
string filePath = @"D:\Test\Artist.txt";
char delimiter = ';';

public Form1() {
  InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e) {
  dt = GetTableFromFile(filePath, delimiter);
  dataGridViewExistingAppntmntRecs.DataSource = dt;
  UpdateDataGridColors();
}

private DataTable GetTableFromFile(string filePath, char delimiter) {
  List<string[]> allArtists = GetArtistList(filePath, delimiter);
  DataTable dt = GetTableColumns(allArtists[0]);
  int totalCols = dt.Columns.Count;
  DataRow dr;
  for (int i = 1; i < allArtists.Count; i++) {
    string[] curArtist = allArtists[i];
    dr = dt.NewRow();
    for (int j = 0; j < totalCols; j++) {
      dr[j] = curArtist[j].ToString();
    }
    dt.Rows.Add(dr);
  }
  return dt;
}

private List<string[]> GetArtistList(string inFilePath, char inDelimiter) {
  string pathToFile = inFilePath;
  char delimiter = inDelimiter;
  List<string[]> listStringArrays = File.ReadAllLines(pathToFile).Select(x => x.Split(delimiter)).ToList();
  return listStringArrays;
}

private DataTable GetTableColumns(string[] allHeaders) {
  DataTable dt = new DataTable();
  foreach (string curHeader in allHeaders) {
    dt.Columns.Add(curHeader, typeof(string));
  }
  return dt;
}

private Color GetColorForRow(DataRowView dr) {
  // paint it black ;-)
  if (dr[0].ToString().Equals("Rolling Stones")) {
    return Color.Black;
  }
  DateTime rowDate;
  DateTime dateNow = DateTime.Now;
  DateTime twoMonthsLimit = dateNow.AddMonths(2);
  DateTime oneMonthLimit = dateNow.AddMonths(1);
  if (dr != null) {
    string rowStringMonth = dr[17].ToString();
    string rowStringYear = dr[18].ToString();
    string rowStringDate = "1/" + rowStringMonth + "/" + rowStringYear;
    if (DateTime.TryParse(rowStringDate, out rowDate)) {
      if (rowDate > twoMonthsLimit)
        return Color.White;
      if (rowDate > oneMonthLimit)
        return Color.Yellow;
      if (rowDate > dateNow)
        return Color.Orange;
      if (rowDate.Month == dateNow.Month && rowDate.Year == dateNow.Year)
        return Color.Orange;
      // this row date is less than todays month date
      return Color.Red;
    } // else date time parse unsuccessful - ignoring
  }
  // date is null
  return Color.White;
}

private void UpdateDataGridColors() {
  Color rowColor;
  DataRowView dr;
  foreach (DataGridViewRow dgvr in dataGridViewExistingAppntmntRecs.Rows) {
    dr = dgvr.DataBoundItem as DataRowView;
    if (dr != null) {
      rowColor = GetColorForRow(dr);
      dgvr.DefaultCellStyle.BackColor = rowColor;
      if (rowColor == Color.Black)
        dgvr.DefaultCellStyle.ForeColor = Color.White;
    }
  }
}

private void dataGridViewExistingAppntmntRecs_CellValueChanged(object sender, DataGridViewCellEventArgs e) {
  if (e.ColumnIndex == 17 || e.ColumnIndex == 18) {
    //MessageBox.Show("End Date Changed");
    UpdateDataGridColors();
  }
}

private void dataGridViewExistingAppntmntRecs_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) {
  UpdateDataGridColors();
}
DataTable dt;
字符串文件路径=@“D:\Test\Artist.txt”;
字符分隔符=';';
公共表格1(){
初始化组件();
}
私有void Form1\u加载(对象发送方、事件参数e){
dt=GetTableFromFile(文件路径,分隔符);
dataGridViewExistingAppntmntRecs.DataSource=dt;
UpdateDagRidColors();
}
私有数据表GetTableFromFile(字符串文件路径,字符分隔符){
List allArtists=GetArtistList(文件路径,分隔符);
DataTable dt=GetTableColumns(allArtists[0]);
int totalCols=dt.Columns.Count;
数据行dr;
for(int i=1;ix.Split(分隔符)).ToList();
返回liststringarray;
}
私有DataTable GetTableColumns(字符串[]AllHeader){
DataTable dt=新的DataTable();
foreach(所有标头中的字符串curHeader){
添加(curHeader,typeof(string));
}
返回dt;
}
专用颜色GetColorForRow(DataRowView dr){
//把它涂成黑色;-)
if(dr[0].ToString().Equals(“滚石”)){
返回颜色。黑色;
}
日期时间行日期;
DateTime dateNow=DateTime.Now;
DateTime twoMonthsLimit=dateNow.AddMonths(2);
DateTime one monthlimit=dateNow.AddMonths(1);
如果(dr!=null){
字符串rowStringMonth=dr[17]。ToString();
字符串rowStringYear=dr[18]。ToString();
字符串rowStringDate=“1/”+rowStringMonth+“/”+rowStringYear;
if(DateTime.TryParse(rowStringDate,out rowDate)){
如果(行日期>两个月限制)
返回颜色。白色;
如果(行日期>一个月限制)
返回颜色。黄色;
如果(rowDate>dateNow)
返回颜色:橙色;
if(rowDate.Month==dateNow.Month&&rowDate.Year==dateNow.Year)
返回颜色:橙色;
//此行日期小于今天的月份日期
返回颜色:红色;
}//else日期时间分析失败-忽略
}
//日期为空
返回颜色。白色;
}
私有void updateDagDagRidColors(){
颜色行颜色;
数据行视图dr;
foreach(dataGridViewExistingAppntmntRecs.Rows中的DataGridViewRow dgvr){
dr=dgvr.DataBoundItem作为DataRowView;
如果(dr!=null){
rowColor=GetColorForRow(dr);
dgvr.DefaultCellStyle.BackColor=行颜色;
if(rowColor==Color.Black)
dgvr.DefaultCellStyle.ForeColor=颜色.白色;
}
}
}
私有void dataGridViewExistingAppntmntRecs\u CellValueChanged(对象发送方,DataGridViewCellEventArgs e){
如果(e.ColumnIndex==17 | | e.ColumnIndex==18){
//MessageBox.Show(“结束日期更改”);
UpdateDagRidColors();
}
}
私有void dataGridViewExistingAppntmntRecs_RowsAdded(对象发送方,DataGridViewRowsAddedEventArgs e){
UpdateDagRidColors();
}

您可以尝试使用
CellFormatting
事件来执行此操作,也可以不使用绘制,只需更改整行
背景色
。然后为或
foreach
添加一个
,无论您喜欢循环所有行。这可能很棘手的一点是,我必须检查两个单元格(月份和年份)的值,然后才能确定是否更改背景色,以及更改到什么程度……确实很棘手。我做了类似的事情,但比较了
Double
而不是
DateTime
。也许可以做一些类似于
DateTime cellval的事情
private void dataGridViewExistingAppntmntRecs_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
    DateTime twoMonthsLimit = DateTime.Now.AddMonths(2);
    DateTime oneMonthLimit = DateTime.Now.AddMonths(1);
    int endYear = // TODO: assign adEndYear value
    int endMonth = // TODO: assign adEndMonth value
    DateTime endDate = new DateTime(endYear, endMonth, 1);
    if (twoMonthsLimit > endDate) // TODO: paint row yellow
    if (oneMonthLimit > endDate) // TODO: paint row orange
    if (endDate < DateTime.Now) // TODO: paint row red
}
DataTable dt;
string filePath = @"D:\Test\Artist.txt";
char delimiter = ';';

public Form1() {
  InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e) {
  dt = GetTableFromFile(filePath, delimiter);
  dataGridViewExistingAppntmntRecs.DataSource = dt;
  UpdateDataGridColors();
}

private DataTable GetTableFromFile(string filePath, char delimiter) {
  List<string[]> allArtists = GetArtistList(filePath, delimiter);
  DataTable dt = GetTableColumns(allArtists[0]);
  int totalCols = dt.Columns.Count;
  DataRow dr;
  for (int i = 1; i < allArtists.Count; i++) {
    string[] curArtist = allArtists[i];
    dr = dt.NewRow();
    for (int j = 0; j < totalCols; j++) {
      dr[j] = curArtist[j].ToString();
    }
    dt.Rows.Add(dr);
  }
  return dt;
}

private List<string[]> GetArtistList(string inFilePath, char inDelimiter) {
  string pathToFile = inFilePath;
  char delimiter = inDelimiter;
  List<string[]> listStringArrays = File.ReadAllLines(pathToFile).Select(x => x.Split(delimiter)).ToList();
  return listStringArrays;
}

private DataTable GetTableColumns(string[] allHeaders) {
  DataTable dt = new DataTable();
  foreach (string curHeader in allHeaders) {
    dt.Columns.Add(curHeader, typeof(string));
  }
  return dt;
}

private Color GetColorForRow(DataRowView dr) {
  // paint it black ;-)
  if (dr[0].ToString().Equals("Rolling Stones")) {
    return Color.Black;
  }
  DateTime rowDate;
  DateTime dateNow = DateTime.Now;
  DateTime twoMonthsLimit = dateNow.AddMonths(2);
  DateTime oneMonthLimit = dateNow.AddMonths(1);
  if (dr != null) {
    string rowStringMonth = dr[17].ToString();
    string rowStringYear = dr[18].ToString();
    string rowStringDate = "1/" + rowStringMonth + "/" + rowStringYear;
    if (DateTime.TryParse(rowStringDate, out rowDate)) {
      if (rowDate > twoMonthsLimit)
        return Color.White;
      if (rowDate > oneMonthLimit)
        return Color.Yellow;
      if (rowDate > dateNow)
        return Color.Orange;
      if (rowDate.Month == dateNow.Month && rowDate.Year == dateNow.Year)
        return Color.Orange;
      // this row date is less than todays month date
      return Color.Red;
    } // else date time parse unsuccessful - ignoring
  }
  // date is null
  return Color.White;
}

private void UpdateDataGridColors() {
  Color rowColor;
  DataRowView dr;
  foreach (DataGridViewRow dgvr in dataGridViewExistingAppntmntRecs.Rows) {
    dr = dgvr.DataBoundItem as DataRowView;
    if (dr != null) {
      rowColor = GetColorForRow(dr);
      dgvr.DefaultCellStyle.BackColor = rowColor;
      if (rowColor == Color.Black)
        dgvr.DefaultCellStyle.ForeColor = Color.White;
    }
  }
}

private void dataGridViewExistingAppntmntRecs_CellValueChanged(object sender, DataGridViewCellEventArgs e) {
  if (e.ColumnIndex == 17 || e.ColumnIndex == 18) {
    //MessageBox.Show("End Date Changed");
    UpdateDataGridColors();
  }
}

private void dataGridViewExistingAppntmntRecs_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) {
  UpdateDataGridColors();
}