我想在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();
}
}
答案 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/GridDT
,DateTime/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");
}
祝你好运!