1.在 toolstripmenu 上添加date控件方法: 1.直接拖动到某一位置上。2.通过 ToolStripControlHost,可以在工具栏或菜单中集成 Windows/自定义 的控件。
若使用第一种方式,会因为 Windows 窗体应用程序的 UI 在不同屏幕上的 DPI(每英寸像素数)不同导致显示的位置不同。
private DateTimePicker dtOrder;
public xx()
{
this.dtOrder = new DateTimePicker();
}
private void xx_Load(object sender, EventArgs e)
{
dtOrder.CalendarFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
dtOrder.Font = new System.Drawing.Font("宋体", 10F);
dtOrder.Name = "dtOrder";
dtOrder.Size = new System.Drawing.Size(175, 27);
dtOrder.TabIndex = 231;
dtOrder.ValueChanged += new System.EventHandler(this.dtOrder_ValueChanged);
var datePicker = new ToolStripControlHost(dtOrder);
toolStripMenu.Items.Add(datePicker);
}
2.DataGridView中列头添加全选按钮
public void AddCheckBoxHeader(int colIndex, string text)
{
System.Windows.Forms.CheckBox ckBox = new System.Windows.Forms.CheckBox();
ckBox.Text = text;
System.Drawing.Rectangle rect = this.xx.GetCellDisplayRectangle(colIndex, -1, true);
ckBox.Size = new System.Drawing.Size(this.xx.Columns[colIndex].Width - 4, dgv.ColumnHeadersHeight - 4);
ckBox.Location = new System.Drawing.Point(rect.Location.X + 3, rect.Location.Y + 3);
this.xx.Controls.Add(ckBox);
}
3.点击DataGridView某列弹出form
private void dgvxx_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex >= 0 && e.ColumnIndex >= 0)
{
// 获取列的名称
string columnName = dgvxx.Columns[e.ColumnIndex].Name;
// 根据列的名称判断
if (columnName == "right!")
{
// 获取选中行的数据
DataGridViewRow selectedRow = dgvReserverProject.Rows[e.RowIndex];
string xx1 = selectedRow.Cells["xx1"].Value.ToString();
int xx2 = int.Parse(selectedRow.Cells["xx2"].Value.ToString());
xx childForm = new xx(xx1, xx2);
if (childForm.ShowDialog() == DialogResult.OK)
{
selectedRow.Cells["apptime"].Value = childForm.xx;
}
}
}
}
4.监控多选框,控制提交按钮
private void dgvxx_CellValueChanged(object sender, DataGridViewCellEventArgs e) { bool flag = false; for (int i = 0; i < dgvxx.RowCount; i++) { var d = dgvxx.Rows[i].Cells["checkbox"].Value; if (d != null) { flag = bool.Parse(d.ToString()); } if (flag) { break; } } this.tsBtnQSubmit.Enabled = flag; this.tsBtnSubmit.Enabled = flag; }
5.修改字段显示值
private void dgvxx_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if (dgvxx.Columns[e.ColumnIndex].Name == "Right" && e.RowIndex >= 0)
{
var originalValue = e.Value;
if (originalValue != null && originalValue.ToString() == "2")
{
e.Value = "太对了";
}
}
}
6.批量生成时间段,或隔半小时,或隔1小时。
private List<string> GeneratorTimeslot()
{
List<string> generatedTimeSlots = new List<string>();
DateTime startTime = DateTime.Parse("08:00");
DateTime endTime = DateTime.Parse("15:00");
TimeSpan interval = projectType == 1 ? TimeSpan.FromHours(1) : TimeSpan.FromMinutes(30);
for (DateTime currentTime = startTime; currentTime < endTime; currentTime += interval)
{
DateTime nextTime = currentTime + interval;
string timeSlot = $"{currentTime.ToString("HH:mm")}-{nextTime.ToString("HH:mm")}";
generatedTimeSlots.Add(timeSlot);
}
return generatedTimeSlots;
}
动态绘制button
public void DisplayUsersInFlowLayoutPanel()
{
List<string> usersDataTable = GeneratorTimeslot();
List<string> filteredTimeSlots = FilteredTimeSlots();
flowLayoutPanel1.Controls.Clear();
foreach (string i in usersDataTable)
{
Button button1 = new Button();
button1.BackColor = System.Drawing.SystemColors.ActiveBorder;
button1.Font = new System.Drawing.Font("宋体", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
button1.ForeColor = System.Drawing.Color.Black;
button1.Location = new System.Drawing.Point(3, 3);
button1.Name = "button1";
button1.Size = new System.Drawing.Size(150, 60);
button1.TabIndex = 0;
button1.Text = i;
button1.BackColor = System.Drawing.Color.LightGray; // Default color
button1.FlatAppearance.BorderColor = System.Drawing.Color.DimGray;
button1.FlatAppearance.BorderSize = 1;
button1.Enabled = !filteredTimeSlots.Any(rt =>
{
string[] rtParts = rt.Split('-');
if (rtParts.Length == 2)
{
//`CultureInfo.InvariantCulture` 用于指定不考虑当前区域设置的固定日期时间格式。
DateTime startTime = DateTime.ParseExact(rtParts[0], "HH:mm", CultureInfo.InvariantCulture);
DateTime endTime = DateTime.ParseExact(rtParts[1], "HH:mm", CultureInfo.InvariantCulture);
string[] iParts = i.Split('-');
if (iParts.Length == 2)
{
DateTime iStartTime = DateTime.ParseExact(iParts[0], "HH:mm", CultureInfo.InvariantCulture);
DateTime iEndTime = DateTime.ParseExact(iParts[1], "HH:mm", CultureInfo.InvariantCulture);
return iStartTime < endTime && iEndTime > startTime;
}
}
return false;
});
if (!button1.Enabled)
{
button1.BackColor = System.Drawing.Color.Gray;
button1.FlatAppearance.BorderColor = System.Drawing.Color.DarkGray;
}
button1.Click += new System.EventHandler(this.tsBtnStop_Click);
flowLayoutPanel1.Controls.Add(button1);
}
}
-
提交前要按需使用结束编辑。
-
this.dgvxx.EndEdit();:
-
EndEdit 方法用于结束对 DataGridView 中的当前单元格的编辑。当用户在单元格中输入数据时,该数据尚未提交,直到调用 EndEdit 方法为止。
-
通常在保存数据或执行其他需要提交用户输入的操作之前,会调用 EndEdit 以确保所有编辑的数据都被提交。
-
-
this.dgvxx.Refresh();:
-
Refresh 方法用于刷新 DataGridView 控件的显示,使其与数据源同步。它会重新绘制 DataGridView 控件,以反映对数据的任何更改。
-
在调用 EndEdit 结束编辑后,可能需要调用 Refresh 来更新显示,以便用户看到最新的数据状态。
-
LINQ
private List<string> FilteredTimeSlots() { // ...... // 创建一个二维列表,用于存储每个项目的已预订时间槽列表 List<List<ReservedTime>> timeSlots = new List<List<ReservedTime>>(); foreach (string id in list) { List<xx> projectTimeSlots = xx.xx().ToList(); if (!flag) { projectTimeSlots = projectTimeSlots.Where(rt => IsRight(rt.xx, rt.xx)).ToList(); } projectTimeSlots = projectTimeSlots.Where(rt => rt.xx < 1).ToList(); timeSlots.Add(projectTimeSlots); } // 将二维列表合并为一维列表 List<xx> mergedTimeSlots = timeSlots.SelectMany(ts => ts).ToList(); // 从合并的时间槽列表中提取时间,并转换为字符串格式 List<string> generatedTimeSlots = mergedTimeSlots.Select(rt => $"{rt.sTimeSlot:HH:mm}").ToList(); // 去除重复的时间,并将结果作为字符串列表返回 return generatedTimeSlots.Distinct().ToList(); }
LINQ 支持以下几种主要查询操作:
-
查询(Query): LINQ 允许使用类似 SQL 的查询语法来检索数据。通过使用 from、where、select 等关键字。
var result = from person in people where person.Age > 18 select person.Name;
-
方法(Method): LINQ 还提供了一组扩展方法,可以在集合上执行各种查询和变换操作。这些方法可以通过 Fluent API 的方式链式调用。
var result = people .Where(person => person.Age > 18) .Select(person => person.Name);
-
时间类型处理:
-
CAST(rr.Time AS DATE) = CAST(GETDATE() AS DATE):
-
这个表达式将 rr.Time 字段(或者变量)转换成日期,并检查它是否等于当前日期 (GETDATE() 返回当前日期和时间)。
-
通过 CAST(... AS DATE),只保留日期部分而忽略时间部分,因此这个表达式检查日期是否相等。
-
-
CONVERT(TIME, GETDATE()) BETWEEN CONVERT(TIME, LEFT(rt.TimeSlot, 5)) AND CONVERT(TIME, RIGHT(rt.TimeSlot, 5)):
-
这个表达式比较当前时间(GETDATE() 返回当前日期和时间)是否在某个时间范围内。
-
CONVERT(TIME, LEFT(rt.TimeSlot, 5)) 和 CONVERT(TIME, RIGHT(rt.TimeSlot, 5)) 会将 rt.TimeSlot 字段中的时间部分转换成 TIME 类型。
-
整个表达式检查当前时间是否在由 rt.TimeSlot 表示的时间范围内。
-
-
DATEPART(HOUR, GETDATE()) = DATEPART(HOUR, CONVERT(TIME, LEFT(rt.TimeSlot, 5))) AND DATEPART(MINUTE, GETDATE()) = DATEPART(MINUTE, CONVERT(TIME, LEFT(rt.TimeSlot, 5))):
-
这个表达式检查当前时间的小时和分钟是否与某个时间(rt.TimeSlot 字段的左侧5个字符表示的时间)的小时和分钟相匹配。
-
DATEPART(HOUR, GETDATE()) 返回当前时间的小时部分,DATEPART(MINUTE, GETDATE()) 返回分钟部分。
-
CONVERT(TIME, LEFT(rt.TimeSlot, 5)) 将 rt.TimeSlot 字段的左侧5个字符表示的时间转换为 TIME 类型,并通过 DATEPART 获取其小时和分钟部分
-
2 RTRIM 和 REPLACE
-- 将字符串"09:00 - 09:30" 格式转换为 "09:00-09:30"
UPDATE yourTableName
SET yourColumnName = REPLACE(yourColumnName, ' - ', '-')
WHERE yourColumnName LIKE '__:__ - __:__';
-
RTRIM 函数:
-
RTRIM(Right Trim)用于去除字符串右边的空格(尾部空格)。
-
例如,RTRIM(' Hello ') 的结果是 ' Hello'。
-
-
REPLACE 函数:
-
REPLACE 用于替换字符串中的指定子字符串。
-
例如,REPLACE('09:00 - 09:30', ' - ', '-') 的结果是 09:00-09:30。
-
-
小备份
空值处理
SELECT COALESCE(columnName, '默认值') AS 别名 FROM 你的表;
分页方式
WITH Table AS (SELECT a, b, c, ROW_NUMBER() OVER (ORDER BY dtCreate ASC) AS RowNum FROM [dbo].[view_TherapistTreatReservedProject] ) SELECT * FROM ProjectCte wHERE RowNum BETWEEN 1 AND 2
ExecuteScalar和ExecuteReader
c#中当值为n/a时,ExecuteScalar 需要使用聚合函数,使结果变成 null。 ExecuteReader时,n/a会被处理为 null。
文章评论