Member 12349103 Ответов: 1

Как исключить время в datagride


Спасибо за ваше время

У меня есть 2 Datagrids dg1 заполняет время для доставки. у dg2 есть обеденное время, которое должно быть исключено из dg1. После нескольких дней исследований я не могу найти хороший пример. Предложения, пожалуйста.

Что я уже пробовал:

Дни
от
исследование
на
массив

CHill60

Как вы заполняете dg1?

Member 12349103

Из текстового поля комбо и выбора даты и времени

CHill60

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

Member 12349103

private void button2_Click(object sender, EventArgs e)
{
if (!String.IsNullOrEmpty(tbSnp_Uld.Text) && !string.IsNullOrEmpty(cbSnp_Uld.Text))
{
double d_tbSnp_Uld = Convert.ToDouble(tbSnp_Uld.Text);
double d_cbSnp_Uld = Convert.ToDouble(cbSnp_Uld.Text);
double result1 = Math.Round(d_tbSnp_Uld / d_cbSnp_Uld);
tbTrailer_Needed.Text = result1.ToString();
}
if (!String.IsNullOrEmpty(cbDaily_Prod.Text) && !string.IsNullOrEmpty(tbTrailer_Needed.Text))
{
double d_cbDaily_Prod = Convert.ToDouble(cbDaily_Prod.Text);
double d_tbTrailer_Needed = Convert.ToDouble(tbTrailer_Needed.Text);
double result2 = d_cbDaily_Prod / d_tbTrailer_Needed;
tbTime_Between.Text = result2.ToString();

}


var start_time = dateTimePicker1.Value.ToString("HH:mm");
var start_time_array = start_time.Split(':');
var today = DateTime.Now;
var trailer_count = Convert.ToInt32(tbTrailer_Needed.Text);
var minutes_apart = Convert.ToDouble(tbTime_Between.Text);
var calculated_start_time = new DateTime(today.Year, today.Month, today.Day, Convert.ToInt16(start_time_array[0]), Convert.ToInt16(start_time_array[1]), 00);


var trailers = new List<trailer__time>();
for (var i = 0; i < trailer_count; i++)
{
if (i == 0)
{
calculated_start_time = calculated_start_time.AddMinutes(0);
}
else
{
calculated_start_time = calculated_start_time.AddMinutes(minutes_apart);
}

trailers.Add(new Trailer__Time
{
Trailer_Number = i,
Delivery_Time = calculated_start_time.ToString("HH:mm")
});
}

dataGridView1 .DataSource = trailers;
}

1 Ответов

Рейтинг:
5

CHill60

Вероятно, самый простой (и самый ясный способ) - это только вставить в trailers если это время не содержится в списке обеденных часов. Например:

var timesToAvoid = (List<string>)dataGridView2.DataSource;
var trailers = new List<trailer__time>();
for (var i = 0; i < trailer_count; i++)
{
    calculated_start_time = calculated_start_time.AddMinutes(i == 0 ? 0 : minutes_apart);

    if (!timesToAvoid.Contains(calculated_start_time.ToString("HH:mm")))
    {
        trailers.Add(new trailer__time
        {
            Trailer_Number = i,
            Delivery_Time = calculated_start_time.ToString("HH:mm")
        });
    }
}

dataGridView1.DataSource = trailers;

Если бы dataGrideView1 указывал только потенциальные сроки доставки, а не номер trailer_number, то было бы еще проще использовать метод Except...
var timesToAvoid = (List&lt;string&gt;)dataGridView2.DataSource;
var altMethod = new List<string>();
  for (var i = 0; i < trailer_count; i++)
  {
      calculated_start_time = calculated_start_time.AddMinutes(i == 0 ? 0 : minutes_apart);
      altMethod.Add(calculated_start_time.ToString("HH:mm"));
  }
  dataGridView1.DataSource = altMethod.Except(timesToAvoid);


Member 12349103

Где я должен добавить этот код в свой кстати блестящий ответ
путают с этой ошибкой строки в lt. & и gt:)
(
var timesToAvoid = (List & lt; string>)dataGridView2. DataSource;)

CHill60

Код, который я опубликовал (Первый БИТ), заменит ваш код ...
var trailers = new List<trailer__time>();
for (var i = 0; i < trailer_count; i++)
{
if (i == 0)
{
calculated_start_time = calculated_start_time.AddMinutes(0);
}
else
{
calculated_start_time = calculated_start_time.AddMinutes(minutes_apart);
}

trailers.Add(new Trailer__Time
{
Trailer_Number = i,
Delivery_Time = calculated_start_time.ToString("HH:mm")
});
}

dataGridView1 .DataSource = trailers;


Линия var timesToAvoid = (List<string>)dataGridView2.DataSource; это просто получение содержимого dataGridView2 в список строк. То (List<string>) является кастинг источник данных для списка строк-лучшее объяснение можно найти здесь ... Приведение и преобразование типов (руководство по программированию на C# )[^]

Member 12349103

CHill60
Опять отлично
получил его для запуска с ошибкой its on (var timesToAvoid = (List & lt;string>) dataGridView2. DataSource;) это просто простой файл класса CSV без формата времени просто текст. Я думаю, что это проблема

ошибка (необработанное исключение 'system. invalidCastexception произошло во время трейлера. Невозможно привести объект типа "system. window.forms. bindingsource" к типу

системы.коллекции.genneric.список системы'.строку

CHill60

Нет... вы должны быть в состоянии привести источник данных dataGridView2 к списку строк, если (и только если) это так, как вы описали ... список раз (который будет в строковом формате). В качестве альтернативы покажите мне, как вы заполняете DataGridView2

Member 12349103

Не для того чтобы строчить вот код который он читает и записывает

private void btnWrite_Click(object sender, EventArgs e)
{
using (SaveFileDialog sfd = new SaveFileDialog() { Filter = "csv|*.csv", ValidateNames = true })
{
if (sfd.ShowDialog() == DialogResult.OK)
{
using (var sw = new StreamWriter(sfd.FileName))
{
var writer = new CsvWriter(sw);
writer.WriteHeader(typeof(Lunch));
foreach (Lunch s in lunchBindingSource.DataSource as List<lunch>)
{
writer.WriteRecord(s);
}
}
MessageBox.Show("Your Data has been Successfully saved.", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}



private void btnRead_Click(object sender, EventArgs e)
{
using (OpenFileDialog ofd = new OpenFileDialog() { Filter = "CSV|*.csv", ValidateNames = true })
{
if (ofd.ShowDialog() == DialogResult.OK)
{
var sr = new StreamReader(new FileStream(ofd.FileName, FileMode.Open));
var csv = new CsvReader(sr);
// lunchBindingSource.DataSource = csv.GetRecords<lunch>().ToString();
lunchBindingSource.DataSource = csv.GetRecords<lunch>(); /// use to create file
}
}
}

private void Form1_Load(object sender, EventArgs e)
{
lunchBindingSource.DataSource = new List<lunch>();
}
}
}

CHill60

Ладно - я понятия не имею, что это за класс. lunch выглядит как. Я понятия не имею, что делает метод GetRecords. В принципе, вам нужно иметь возможность получить список времен, которых следует избегать. И только добавляйте вещи в trailers коллекция, если время, которое вы пытаетесь добавить, не входит в список вещей, которых следует избегать.
Я подозреваю, что вы слишком все усложняете ... обеденное время должно быть просто простым списком, не уверенным, что на самом деле означает номер трейлера и почему у него будет только одно время доставки. Попробуйте сделать шаг назад и подумать о том, чего вы действительно пытаетесь достичь здесь.

Member 12349103

Вы правы, допустим, у меня есть CSV-файл, который я помещаю во время 1: 00-1: 30 раз в aviod. Когда время вычисляется, я хочу, чтобы оно пропустило этот временной интервал. Я уверен, что если бы вы видели, как все это работает, то это был бы простой код для вас. Спасибо за терпение

Member 12349103

Любое другое решение

Member 12349103

Какое-нибудь другое решение?