^(* ̄(oo) ̄)^

  • 首页
  • 博客
  • 文档
  • 网盘
  • 仓库
  • 简介
Keep Learning
  1. 首页
  2. 博客
  3. 正文

C# winform常用操作

2024年1月29日 1530点热度

Winform

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);
        }
    }
  1. 提交前要按需使用结束编辑。

  1. this.dgvxx.EndEdit();:

    • EndEdit 方法用于结束对 DataGridView 中的当前单元格的编辑。当用户在单元格中输入数据时,该数据尚未提交,直到调用 EndEdit 方法为止。

    • 通常在保存数据或执行其他需要提交用户输入的操作之前,会调用 EndEdit 以确保所有编辑的数据都被提交。

  2. 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 支持以下几种主要查询操作:

  1. 查询(Query): LINQ 允许使用类似 SQL 的查询语法来检索数据。通过使用 from、where、select 等关键字。

    var result = from person in people
                 where person.Age > 18
                 select person.Name;
  2. 方法(Method): LINQ 还提供了一组扩展方法,可以在集合上执行各种查询和变换操作。这些方法可以通过 Fluent API 的方式链式调用。

    var result = people
                 .Where(person => person.Age > 18)
                 .Select(person => person.Name);

Sql相关

  1. 时间类型处理:

  • 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 '__:__ - __:__';
  1. RTRIM 函数:

    • RTRIM(Right Trim)用于去除字符串右边的空格(尾部空格)。

    • 例如,RTRIM(' Hello ') 的结果是 ' Hello'。

  2. REPLACE 函数:

    • REPLACE 用于替换字符串中的指定子字符串。

    • 例如,REPLACE('09:00 - 09:30', ' - ', '-') 的结果是 09:00-09:30。

  1. 小备份

空值处理

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。

标签: c++
最后更新:2024年8月26日

九州安所如

程序员

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

COPYRIGHT © 2023 zhu

鲁ICP备2026022547号