如何在Datagridview Windows窗体C#中使用运行时条件在新列中添加当前缺少的值

时间:2018-07-18 10:52:43

标签: c# datagridview

我想在datagridview的运行时中添加出勤条件。 例如,如果时间<= 09:45:00,则显示当前;否则,如果时间为null,则在P / A列中显示为不存在,然后使用datagridview Windows窗体c#

添加数据库
           try
{
              SqlCommand ucd = new SqlCommand("indiviual_attendence", ConnectionString.Getconnection());
              ucd.CommandType = CommandType.StoredProcedure;
              ucd.Parameters.Add("@id", SqlDbType.Int).Value = 2;
              ucd.Parameters.Add("@empcode", SqlDbType.NVarChar).Value = value;
              SqlDataAdapter sda = new SqlDataAdapter(ucd);
              dt = new DataTable();
              sda.Fill(dt);
              if (dt.Rows.Count > 0)
              {
                  textBox2.Text = dt.Rows[0][0].ToString();
              }
              ConnectionString.closeconnection();
              if (textBox2.Text != "")
              {
                  cmd = new SqlCommand("indiviual_attendence", ConnectionString.Getconnection());
                              cmd.CommandType = CommandType.StoredProcedure;
                             cmd.Parameters.Add("@id",SqlDbType.Int).Value = 3;
                             cmd.Parameters.Add("@empcode",SqlDbType.NVarChar).Value = "%"+value;
                  SqlDataAdapter sd = new SqlDataAdapter(cmd);
                  dt = new DataTable();
                  sd.Fill(dt);
                  if (dt.Rows.Count > 0)
                  {
                      dataGridView1.DataSource = dt;
                      dataGridView1.Columns[0].HeaderText = "Code";
                      dataGridView1.Columns[1].HeaderText = "Name";
                      dataGridView1.Columns[2].HeaderText = "Department";
                      dataGridView1.Columns[3].HeaderText = "Year";
                      dataGridView1.Columns[4].HeaderText = "Month";
                      dataGridView1.Columns[5].HeaderText = "Day";
                      dataGridView1.Columns[6].HeaderText = "Time";
                      dataGridView1.Columns[7].HeaderText = "Status";
                      dataGridView1.Columns[8].HeaderText = "EMP/MACH-CODE";  
                      dataGridView1.Columns[9].HeaderText = "Attendance_id";
                      dataGridView1.Columns[9].Visible = false;
                     dataGridView1.Columns[10].HeaderText = "P/A";
                     // dataGridView1.Columns["Attendance_id"].Visible = false;
                      dataGridView1.AllowUserToAddRows = false;
                      dataGridView1.AllowUserToResizeColumns = false;
                      dataGridView1.BackgroundColor = System.Drawing.SystemColors.Control;
                      this.dataGridView1.DefaultCellStyle.BackColor = Color.GhostWhite;

                  }

                  ConnectionString.closeconnection();
              }
          }
          catch (Exception ex)
          {
              MessageBox.Show(ex.Message);
              ConnectionString.closeconnection();
          }

    }

enter image description here

2 个答案:

答案 0 :(得分:0)

您在这里有2个选择:

首先,更简单的方法是更改​​存储过程,添加列并计算存储过程中的存在

第二个是将列添加到DataTable并使用foreach计算值。将其添加到if的{​​{1}}和DataSource的设置之间

DataGridView

答案 1 :(得分:0)

当前方法可能会遇到的一个问题是,如果用户“更改”网格中的“时间”值之一,该怎么办?仅更改了一行后,似乎无需再次遍历所有行。一种可能的解决方案是连接“单元值已更改”事件。在这种情况下,可以检查“时间”值是否更改,如果更改,则相应地更新“ P / A”单元格。

以上内容将解决用户“更改”“时间”值时的问题,但是当设置了网格数据源时,这不会设置“ P / A”列。由于这是一个“计算”值(下面有更多内容),因此不在数据库中。因此,遍历所有行并检查每个“时间”值并设置“ P / A”值将是微不足道的。或者,由于我们已经有一个事件,该事件将在“时间”值更改时设置“ P / A”值,因此在设置网格数据源后立即为每一行调用该事件可能很方便。当然,这不一定是最好的方法,但是代码只会被调用一次。

最后,我必须在某种程度上不同意“保存”数据库中的“缺少/存在”值。这是一个“计算”值,将取决于什么是“时间”值。如果在该行的某处,“时间”值更改,则最好更新“ P / A”值,否则数据库将损坏。似乎没有必要将该值保存在数据库中,因为您可以从“时间”值中获取该信息。那是我的看法,如果您要保存“ P / A”值,则一定要省掉。

网格CellValueChanged事件在下面。进行检查以确认“时间”列已更改并且该行有效。更多检查“时间”值是否为空。最后是时间比较,以查看单元格时间是否小于“ 9:45:00”。然后设置“ P / A”单元格值。

private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) {
  // note: error checking (data error) is missing if the user types in an invalid date/time
  if (e.ColumnIndex == 2 && e.RowIndex >= 0 && !dataGridView1.Rows[e.RowIndex].IsNewRow ) {
    if (dataGridView1.Rows[e.RowIndex].Cells["Time"].Value != null) {
      if (dataGridView1.Rows[e.RowIndex].Cells["Time"].Value.ToString() != "") {
        DateTime cellTime = (DateTime)dataGridView1.Rows[e.RowIndex].Cells["Time"].Value;
        if (cellTime <= TargetTime)
          dataGridView1.Rows[e.RowIndex].Cells["P/A"].Value = "Present";
        else
          dataGridView1.Rows[e.RowIndex].Cells["P/A"].Value = "?-Greater than 9:45:00 A.M.";
      }
      else {
        dataGridView1.Rows[e.RowIndex].Cells["P/A"].Value = "Absent-empty";
      }
    }
    else {
      dataGridView1.Rows[e.RowIndex].Cells["P/A"].Value = "Absent-null NH";
    }
  }
}

接下来是在设置网格数据源之后用于设置“ P / A”列值的额外代码。遍历所有行并使用当前行的“时间”列索引触发网格CellValueChanged事件。

private void SetPACol() {
  for (int i = 0; i < dataGridView1.Rows.Count; i++) {
    dataGridView1_CellValueChanged(this, new DataGridViewCellEventArgs(2, i));
  }
}

将它们放在一起进行测试。创建一些全局变量:DataTable/GridDTDateTime/TargetTime网格设置为今天上午9:45:00。加载表单时,设置DatatTable列,用数据填充表格,将表格数据源设置为表格,最后运行设置“ P / A”值的方法。

private DateTime TargetTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 9, 45, 00);
private DataTable GridDT;

public Form1() {
  InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e) {
  GridDT = GetTable();
  FillTable(GridDT);
  dataGridView1.DataSource = GridDT;
  SetPACol();
}

private void SetPACol() {
  for (int i = 0; i < dataGridView1.Rows.Count; i++) {
    dataGridView1_CellValueChanged(this, new DataGridViewCellEventArgs(2, i));
  }
}

private DataTable GetTable() {
  DataTable dt = new DataTable();
  dt.Columns.Add("Code", typeof(int));
  dt.Columns.Add("Name", typeof(string));
  dt.Columns.Add("Time", typeof(DateTime));
  dt.Columns.Add("P/A", typeof(string));
  return dt;
}

private void FillTable(DataTable dt) {
  dt.Rows.Add(1642, "Name1", new DateTime(TargetTime.Year, TargetTime.Month, TargetTime.Day, 9, 47, 00));
  dt.Rows.Add(1642, "Name2", new DateTime(TargetTime.Year, TargetTime.Month, TargetTime.Day, 9, 45, 00));
  dt.Rows.Add(1642, "Name3", new DateTime(TargetTime.Year, TargetTime.Month, TargetTime.Day, 9, 44, 59));
  dt.Rows.Add(1642, "Name4", null);
  dt.Rows.Add(1642, "Name5", new DateTime(TargetTime.Year, TargetTime.Month, TargetTime.Day, 9, 47, 00));
  dt.Rows.Add(1642, "Name6");
}

祝你好运!