Ниже приведен пример того, что я описываю. В вашем обновлении, как я уже говорил, если данные «date», поступающие из базы данных, находятся в объекте DateTime
, то нет необходимости «конвертировать» дату в string
, а затем преобразовать ее обратно в *Объект 1003 *, поскольку у вас уже есть объект DateTime
.
ПРИМЕЧАНИЕ. Из ваших изображений видно, что объект DateTime
, возвращенный из базы данных, «может» «форматировать» дату для отображения в «формат дд / мм / гггг… поэтому код не будет работать, когда вы попытаетесь преобразовать дату в string
, а затем преобразовать это string
обратно в DateTime
объект.
Пример встрока кода
Convert.ToDateTime(row.Cells["Close Date"].Value.ToString())
потерпит неудачу, так как метод ToString
может возвращать дату в формате «дд / мм / гггг». Чтобы избежать этого, просто не конвертируйте дату.
Даже если метод ToString
возвращает «допустимую» строку даты, нет необходимости преобразовывать эту строку в объект DateTime
, так как у вас уже естьDateTime
object.
Наконец, для этого контекста следует отметить, что лучше циклически проходить по сеткам DataTable
, а НЕ по сеткам, как делает ваш текущий код. Причина в том, что, когда вы перебираете строки сетки и пытаетесь получить значение «Date» в ячейках, например… date1 = (DateTime)row.Cells["Close Date"].Value;
не выполнится с неверным приведением. Здесь вам нужно будет преобразовать значение string
в значение DateTime
, которое, как мы уже знаем, не нужно. Я надеюсь, что это имеет смысл.
DataTable dt4;
DataTable conditionsData;
public Form1() {
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e) {
dt4 = GetOriginalTable();
FillOriginalTable(dt4);
dataGridView1.DataSource = dt4;
}
private DataTable GetOriginalTable() {
DataTable dt = new DataTable();
dt.Columns.Add("ID", typeof(string));
dt.Columns.Add("Work Order", typeof(string));
dt.Columns.Add("Required By Date", typeof(DateTime));
dt.Columns.Add("Close Date", typeof(DateTime));
return dt;
}
private DataTable GetConditionsTable() {
DataTable dt = new DataTable();
dt.Columns.Add("Conditions", typeof(string));
dt.Columns.Add("Counterr", typeof(int));
return dt;
}
private void FillOriginalTable(DataTable originalDT) {
originalDT.Rows.Add("1", "150", new DateTime(2019, 09, 19), new DateTime(2019, 09, 19));
originalDT.Rows.Add("2", "151", new DateTime(2019, 09, 19), new DateTime(2019, 09, 21));
originalDT.Rows.Add("3", "152", new DateTime(2019, 09, 19), new DateTime(2019, 09, 22));
originalDT.Rows.Add("4", "153", new DateTime(2019, 09, 19));
DataRow newRow = originalDT.NewRow();
newRow["ID"] = "5";
newRow["Work Order"] = "154";
newRow["Close Date"] = new DateTime(2019, 09, 19);
originalDT.Rows.Add(newRow);
}
private void show_data_Click(object sender, EventArgs e) {
int close2 = 0;
int closemorethan2 = 0;
int execption = 0;
DateTime date1;
DateTime date2;
TimeSpan diff;
foreach (DataRow row in dt4.Rows) {
if (row["Required By Date"].ToString() != "" && row["Close Date"].ToString() != "") {
date1 = (DateTime)row["Close Date"];
date2 = (DateTime)row["Required By Date"];
diff = date1.Subtract(date2);
if (diff.Days <= 2) {
close2++;
}
else {
closemorethan2++;
}
}
else {
execption++;
}
}
conditionsData = GetConditionsTable();
conditionsData.Rows.Add("Close in 2 Days", close2);
conditionsData.Rows.Add("Close after 2 Days", closemorethan2);
conditionsData.Rows.Add("Exceptions", execption);
dataGridView2.DataSource = conditionsData;
}