Переопределение времени при переносе данных в DataGridView

138
27 апреля 2022, 17:40

После обработки одной из таблиц DGVW1 данные (например) перетекают в DGVW3 и в момент, когда это происходит в ячейку записывается время (код прилагается). Нужно чтобы каждая последующая ячейка со временем была на +1 секунду.
Так это выглядит на данный момент:

А теперь нюансы:

  1. время не должно повторятся.

  2. если из DGVW1 данных пришло 20 то и секунд последующих ячеек должно прибавится 20, НО в этот промежуток времени человек может обработать в DGVW1 еще один документ и получается, что он находится в будущем, поэтому если перенесет эти обработанные данные в DGVW3 то эти данные будут во времени не корректны, суть должна быть в том, что бы новые данные в этот промежуток времени вставились после (грубо говоря новая ячейка должна иметь время 16:45:35 хотя время у него на часах 16:45:32)

  3. добавить миллисекунды не вариант...

Ну и, собственно, сам код переноса из одного DGVW в другой DGVW

string name_profil;
DateTime now = DateTime.Now;
if (dataGridView2.SelectedCells[0].Value.ToString() == "")
{
    name_profil = "Без профиля";
}
else
{
    name_profil = dataGridView2.CurrentRow.Cells[0].Value.ToString();
}
try
{
    if (dataGridView3.RowCount - 1 > 1) // если что тут была >2 поменять если что то пойдет не по плану
    {
        for (int i = dataGridView3.RowCount - 2; i >= 0; i--)
        {
            var isEquals = (String.Compare(dataGridView3.Rows[i].Cells[0].Value.ToString().ToUpper(), name_profil.ToUpper()) == 0);
            var cellsIsEmpty = string.IsNullOrEmpty(dataGridView3.Rows[i].Cells[1].Value.ToString());
            //var cellsIsEmpty = cellsIsEmpty && string.IsNullOrEmpty (dataGridView3.Rows[i].Cells[2].Value.ToString ());
            if (cellsIsEmpty)
            {
                if (!isEquals)
                {
                    dataGridView3.Rows.Add(name_profil, "", "", now.ToString("dd.MM.yyyy HH:mm:ss"));
                }
                break;
            }
        }
    }
    else
    {
        dataGridView3.Rows.Add(name_profil, "", "", now.ToString("dd.MM.yyyy HH:mm:ss"));
    }
    for (int j = 0; j < dataGridView3.RowCount; j++)
    {
        if (dataGridView3.Rows[j].Cells[0].Value == dataGridView2.CurrentRow.Cells[0].Value)
        {
            dataGridView3.Rows[j].Cells[0].Style.BackColor = Color.Red;
        }
    }
    for (int i = 0; i <= dataGridView1.Rows.Count - 1; i++)
    {
        DataGridViewRow hh = dataGridView1.Rows[i];
        dataGridView3.Rows.Add(hh.Cells[0].Value.ToString().ToUpper().Clone(),
            hh.Cells[1].Value.ToString().Clone(),
            hh.Cells[2].Value.ToString().Clone(),
            now.ToString("dd.MM.yyyy HH:mm:ss"));
    }
    remove_tire();
}
catch
{
    MessageBox.Show("какая-то ошибка");
} // все что ниже удаляет последнее повторение
Answer 1

Путем нелегкого мозгового штурма, был переделан костыль.

  1. при переносе из одного dgvw в другой сделать один большой цикл для всего этого дела и добавлять построчно, так же к существующему времени + 1 секунда.
  2. при каждом нажатии кнопки прибавлять к существующему времени столько секунд, сколько элементов.
  3. код прилагаю.

костыль работает, но если нажать на кнопку с этим кодом в несколько миллисекунд, то будет повторение. на первое время сойдет

        string name_profil;
        DateTime now = DateTime.Now;
        now = now.AddSeconds(dataGridView3.Rows.Count);  ** 3 пункт**
        if (dataGridView2.SelectedCells[0].Value.ToString() == "")
        {
            name_profil = "Без профиля";
        }
        else
        {
            name_profil = dataGridView2.CurrentRow.Cells[0].Value.ToString();
        }
        for (int i = 0; i < dataGridView1.Rows.Count; i++)
        {
            if (dataGridView3.RowCount - 1 > 1) 
            {
                for (int k = dataGridView3.RowCount - 2; k >= 0; k--)
                {
                    var isEquals =
                        (String.Compare(dataGridView3.Rows[k].Cells[0].Value.ToString().ToUpper(), name_profil.ToUpper()) == 0);
                    var cellsIsEmpty =
                        string.IsNullOrEmpty(dataGridView3.Rows[k].Cells[1].Value.ToString());
                    //var cellsIsEmpty = cellsIsEmpty && string.IsNullOrEmpty (dataGridView3.Rows[i].Cells[2].Value.ToString ());
                    if (cellsIsEmpty)
                    {
                        if (!isEquals)
                        {
                            dataGridView3.Rows.Add(name_profil, "", "", now.ToString("dd.MM.yyyy HH:mm:ss"));
                            
                        }
                        now = now.AddSeconds(1); **добавление секунды если повторений названий нет **
                        break;
                    }
                }
            }
            else
            {
                now = now.AddSeconds(1); **это тоже плюс секунда если профиля нет**
                dataGridView3.Rows.Add(name_profil, "", "", now.ToString("dd.MM.yyyy HH:mm:ss"));
            }
            for (int j = 0; j < dataGridView3.RowCount; j++)
            {
                if (dataGridView3.Rows[j].Cells[0].Value == dataGridView2.CurrentRow.Cells[0].Value)
                {
                    dataGridView3.Rows[j].Cells[0].Style.BackColor = Color.Red;
                 }
            }
                DataGridViewRow hh = dataGridView1.Rows[i];
                now = now.AddSeconds(1); **и вот тут еще плюс секунду**
                dataGridView3.Rows.Add(hh.Cells[0].Value.ToString().ToUpper().Clone(),
                hh.Cells[1].Value.ToString().Clone(),
                hh.Cells[2].Value.ToString().Clone(),
                 now.ToString("dd.MM.yyyy HH:mm:ss")
                 ); 
                          
        }
READ ALSO
При наследовании класс родителя возвращает 0

При наследовании класс родителя возвращает 0

При вызову Soldier метод SoldierFindQ() возвращает произведние weight и hight, как и нужно

147
Проблема включения микрофона в программе C#

Проблема включения микрофона в программе C#

я сделал голосового ассистента на Python, но решил, перейти на C#По видеоуроку я написал этот код который должен слушать микрофон и писать цифру...

213
Возвращаемый тип для анонимного метода

Возвращаемый тип для анонимного метода

Есть анонимный метод (выполняет через рефлексию методы объекта)

122
Почему оно не сохраняет?

Почему оно не сохраняет?

Не понимаю почему сохранение не работает, скинул весь скрипт, обратите внимание например на функцию MusicVolumeSet, и в старте на её загрузку, я вроде...

149