如何按时间

时间:2017-03-31 01:08:35

标签: c# sorting datetime datagridview

我们是否可以按datagridview列对hh:mm:ss列进行排序,即使此列单元格包含String数据类型的时间,有关我的项目的更多信息,我也会从另一个{{1要显示在此问题中正在讨论的当前datagridview中,然后在此列的单元格中包含转换为datagridview的{​​{1}}(不是24小时或12小时格式)数据类型,所以我希望此TimeSpan中的第一行包含此列中所有现有值的时间跨度较小,或者以String的最近单元格值包含datagridview的最近单元格值,如果我们可以对列进行排序这样做怎么做,或者我们不能按照我计划的方式对它进行排序。

例如:(未排序的列)

00:00:00

Column

00:20:30

00:12:50

(已排序的列)

00:16:00

Column

00:12:50

00:16:00

由于

1 个答案:

答案 0 :(得分:1)

发表评论:

  

“因为我需要从将在此datagridview中排序的第一行显示在文本框中,这些值正在改变每个   时间间隔

我猜您希望文本框始终显示DataGridView中特定列的最低值。我不确定是否只是在数据网格视图中查看特定单元格是最好的方法。这似乎是这种情况,您要求的列的排序似乎暗示顶部单元格将始终是最短的时间跨度。

我发现只需单击列标题即可将字符串正确排序为字符串。正如您所评论的那样,字符串前面可能还有其他文本。如果是这种情况,那么你将不得不清理字符串,否则下面注释掉的代码可以通过简单地在添加新行或对现有时间跨度进行更改时对该列上的网格进行排序来满足此排序要求细胞

无论网格中使用的排序如何,此文本框都应该有效。这个文本框唯一需要查找的是当上述两个事件之一发生时。如果网格添加了行或用户更改了当前显示的时间范围的值,那么我们可能需要更新此文本框中的文本。

这就是下面的代码。如果将新行添加到网格中或用户对时间跨度单元格进行更改,则这些事件将更新最低时间跨度文本框。代码只是循环遍历网格以确定哪个时间跨度更短。如果数据很大,则可以更快地使用新添加或更改的数据检查当前最短时间跨度。下面的代码从字符串中取出最后八个字符,其形式应为“hh:mm:ss”,然后从这些字符串开始计算时间并进行比较。希望这会有所帮助。

按下按钮单击事件,以根据列[0]

切换datagridview排序
private void button1_Click(object sender, EventArgs e) {
  DataGridViewColumn sortCol = dataGridView1.Columns[0];
  if (dataGridView1.SortOrder == SortOrder.None) {
    dataGridView1.Sort(sortCol, ListSortDirection.Ascending);
  } else {
    if (dataGridView1.SortOrder == SortOrder.Ascending) {
      dataGridView1.Sort(sortCol, ListSortDirection.Descending);
    } else {
      dataGridView1.Sort(sortCol, ListSortDirection.Ascending);
    }
  }
}

两个事件“CellValueChanged”和“RowsAdded”用于更新TextBox tbShortestTime

private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) {
  if (e.ColumnIndex == 0) {
    tbShortestTime.Text = GetShortestTime();
    //DataGridViewColumn sortCol = dataGridView1.Columns[0];
    //dataGridView1.Sort(sortCol, ListSortDirection.Ascending);
  }
}
private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) {
  tbShortestTime.Text = GetShortestTime();
  //DataGridViewColumn sortCol = dataGridView1.Columns[0];
  //dataGridView1.Sort(sortCol, ListSortDirection.Ascending);
}

private string GetShortestTime() {
  string lowestString = "999:23:59";
  for (int i = 0; i < dataGridView1.Rows.Count; i++) {
    DataGridViewRow curRow = dataGridView1.Rows[i];
    if (!curRow.IsNewRow && curRow.Cells[0].Value != null) {
      lowestString = GetLowerTimeString(lowestString, curRow.Cells[0].Value.ToString());
    }
  }
  return lowestString;
}

private string GetLowerTimeString(string inTime1String, string inTime2String) {
  if (inTime1String.Length >= 8 && inTime1String.Length >= 8) {
    string time1String = inTime1String.Substring(inTime1String.Length - 8, 8);
    string time2String = inTime2String.Substring(inTime2String.Length - 8, 8);
    TimeSpan t1 = new TimeSpan();
    TimeSpan t2 = new TimeSpan();
    TimeSpan.TryParse(time1String, out t1);
    TimeSpan.TryParse(time2String, out t2);
    if (t1 < t2)
      return time1String;
    if (t1 > t2)
      return time2String;
    return time1String;
  }
  else {
    if (inTime1String.Length > inTime2String.Length)
      return inTime2String;
    else
      return inTime1String;
  }
}