Зацикливание двух определенных столбцов и выполнение счетчика вычислений, ввод в другое представление данных - PullRequest
0 голосов
/ 03 октября 2019

У меня есть сетка данных с несколькими столбцами, и я хотел бы выбрать 2 столбца, каждый из которых является датой, и зациклить их так, чтобы в каждой строке был расчет с обеими датами, но я сделал счетчик с ними, чтобы я мог ввести его в другойdatagridview и получить отчет (статистика) для данных. Столбцы будут рандомизированы. Я делаю это в visual studio c #.

Мой код (неверный)

private void show_data_Click(object sender, EventArgs e)
    {
        int close2 = 0, closemorethan2 = 0, execption = 0;
        connection.Open();
        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
                    DateTime one = Convert.ToDateTime(row.Cells["Close Date"].Value.ToString());
                    DateTime two = Convert.ToDateTime(row.Cells["Required by date"].Value.ToString());
                    DateTime test = one.Date;
                    DateTime test2 = two.Date;
                    TimeSpan diff = test.Subtract(test2);
                    if (one == null || two == null)
                    {
                        execption++;
                    }
                    else if (diff.Days <= 2)
                    {
                        close2++;
                    }
                    else
                    {
                        closemorethan2++;
                    }                      
                }
            }
        }
        //datagridview 2 data to show stats 
        DataSet ds = new DataSet();
        DataTable dt;
        DataRow dr;
        DataColumn condition;
        DataColumn number;

        dt = new DataTable();
        condition = new DataColumn("Conditions", Type.GetType("System.String"));
        number = new DataColumn("counter", Type.GetType("System.Int32"));

        dt.Columns.Add(condition);
        dt.Columns.Add(number);

        dr = dt.NewRow();
        dr["Conditions"] = "Close in 2 Days";
        dr["counter"] = close2;

        dt.Rows.Add(dr);
        dr = dt.NewRow();
        dr["Conditions"] = "Close after 2 Days";
        dr["counter"] = closemorethan2;

        dt.Rows.Add(dr);
        dr = dt.NewRow();
        dr["Conditions"] = "Exceptions";
        dr["counter"] = execption;       
        dt.Rows.Add(dr);
        dr = dt.NewRow();           
        dt.Rows.Add(dr);
        ds.Tables.Add(dt);
        dataGridView2.DataSource = dt;
        connection.Close();
    }

Пример

ms-access Спасибо

1 Ответ

0 голосов
/ 03 октября 2019

Ниже приведен пример того, что я описываю. В вашем обновлении, как я уже говорил, если данные «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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...