我在資料表中有以下結果,我想在其中驗證記錄以查看 UI 中的給定日期是否存在任何重疊
當用戶嘗試通過給出結束日期 >= 12 月 22 日來編輯第一個條目時,我想拋出一個驗證,說存在超過一圈。這是我正在研究但沒有奏效的示例代碼
public partial class Form1 : Form
{
DataTable dt = new DataTable();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("StartDt", typeof(DateTime));
dt.Columns.Add("EndDt", typeof(DateTime));
dt.Rows.Add(1, new DateTime(2021, 11, 30), new DateTime(2021, 12, 14));
dt.Rows.Add(2, new DateTime(2021, 12, 22), new DateTime(2022, 01, 05));
}
private void button1_Click(object sender, EventArgs e)
{
foreach (DataRow row in dt.Rows)
{
if (Convert.ToDateTime(row["StartDt"]).Date >= dateTimePicker1.Value.Date && Convert.ToDateTime(row["EndDt"]).Date <= dateTimePicker1.Value.Date)
{
}
}
}
}
當我根據它位于第二行的資料選擇日期為 2021 年 12 月 22 日時,它應該回傳 false

linq中任何可能的解決方案也沒有回圈資料
uj5u.com熱心網友回復:
linq中任何可能的解決方案也沒有回圈資料
如果你打算在資料表上使用 LInQ,你真的應該做一個強型別的。在弱型別上使用 linq 是一件丑陋、丑陋的事情
做這個:
- 將新的 DataSet 型別的檔案添加到您的專案中。稱它為明智的東西,而不是 DataSet1。如果您正在預約應用程式,可以將其稱為 SchedulerDS
- 打開它,然后在 props 網格中將資料集的名稱設定為類似 SchedulerDS 的名稱。右鍵單擊設計圖面并選擇添加資料表。稱其為明智的事情,例如約會
- 右鍵單擊資料表并添加一個 Id 列(型別 int)和一個 StartDate 和 EndDate 列(日期)
- 保存
現在您已準備好用強型別資料表替換弱型別資料表。黃金法則:避免使用 .Rows 屬性;只需直接訪問您的強型別資料表,就好像它是一個陣列一樣。一旦您訪問 Rows,您就會回到弱型別資料表的痛苦世界
//yes
foreach(var row in datatable)
//no
foreach(DataRow row in datatable.Rows)
//yes
datatable.Where(...)
//heck no
datatable.Rows.Cast<DataRow>().Where(...)
讓我們開始:
SchedulerDS.AppointmentsDataTable dt = new SchedulerDS.AppointmentsDataTable();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
dt.AddAppointmentsRow(1, new DateTime(2021, 11, 30), new DateTime(2021, 12, 14));
dt.AddAppointmentsRow(2, new DateTime(2021, 12, 22), new DateTime(2022, 01, 05));
}
你可以為你的“任何行重疊?”
var d = dateTimePicker.Value.Date;
var anyOverlap = dt.Any(row => row.StartDate >= d && row.EndDate <= d);
return !anyOverlap; //if any overlap is true, validation should be false
uj5u.com熱心網友回復:
長話短說:如果要查找范圍之外的值,則必須檢查該值是在范圍之前還是在范圍之后,而不是檢查值是否在范圍之前和之后。
正確的范圍檢查邏輯(包括日期或其他可排序資料)將是
測驗,如果actualValue在包含范圍內borderStartborderEnd
borderStart <= actualValue && actualValue <= borderEnd
測驗,如果在排他范圍actualValue之間borderStartborderEnd
borderStart < actualValue && actualValue < borderEnd
測驗,如果actualValue不介于和包含范圍內borderStartborderEnd
borderStart > actualValue || actualValue > borderEnd
測驗,actualValue如果不在排他范圍內borderStartborderEnd
borderStart >= actualValue || actualValue >= borderEnd
選擇你的毒藥。
uj5u.com熱心網友回復:
好吧,我注意到你使用>= dtPicker1 && <= dtPicker1. 您可能意味著將第二個更改dtPicker1為dtPicker2?
編輯:這是關于 DataTable linq的SO 答案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/411865.html
標籤:
上一篇:無法創建物體框架代碼優先遷移
下一篇:如何使用異步函式修復此錯誤`sys:1:RuntimeWarning:coroutine'finish_process'isneverawaited`
