Question

I have a DataGridView that only displays 2 columns: Employee Name, and a checkbox called Attended. This is to keep track of employee attendance at safety meetings.

When this DGV is loaded, I would like the employees who have already been marked as having attended to have a check mark in their respective checkboxes.

This is what I tried, but it just checks ALL boxes:

private void LoadEmpAttendanceDGV()
{
    string sqlstm = "SELECT EmpID, EmpName FROM dbo.MY_TABLE";
    // Additional code here, which loads the grid.

    for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
    {
        myKey.empID = tempEmpID;
        myKey.trainingID = tempTrainingID;
        myRow = trainingSession.Read(myKey);

        // Check to see if record exists, meaning employee attended meeting.
        if (myRow != null)
        {
            for (int j=0; j < ds.Tables[0].Rows.Count; j++)
            {
                myDataGridView["Attended", j].Value = true;
                // Where "Attended" is the name of my CheckBox column
            }
        }
    }
}

If anyone can offer any insight, I would greatly appreciate it.

Was it helpful?

Solution

Create tables like this

SqlServer Code

USE [acc]
GO

CREATE TABLE [dbo].[EmpAttendedTheMeeting](
    [EName] [varchar](50) NOT NULL
) ON [PRIMARY]

GO

CREATE TABLE [dbo].[Employees](
    [EName] [varchar](50) NOT NULL
) ON [PRIMARY]

GO
insert into Employees(EName) values('kashif')
insert into Employees(EName) values('sunny')
insert into Employees(EName) values('kamran')

insert into EmpAttendedTheMeeting(EName) values('kashif')
insert into EmpAttendedTheMeeting(EName) values('kamran')

c# Code

namespace WindowsFormsApplication9
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        DataGridViewTextBoxColumn tb = new DataGridViewTextBoxColumn();
        DataGridViewCheckBoxColumn cb = new DataGridViewCheckBoxColumn();
        private void Form1_Load(object sender, EventArgs e)
        {
            FormatGrid(dataGridView1);
            LoadDg();
        }
        private void FormatGrid(DataGridView dg)
        {
            dg.Columns.Add(tb);
            dg.Columns[0].HeaderText = "EName";
            dg.Columns[0].Width = 199;

            dg.Columns.Add(cb);
            dg.Columns[1].HeaderText = "Attended";
            dg.Columns[1].Width = 69;            
        }
        private void LoadDg()
        {
            SqlConnection cn = new SqlConnection("data source=localhost;initial catalog=acc;uid=sa;pwd=emotions");                
            SqlDataAdapter da = new SqlDataAdapter("select Employees.EName, EmpAttendedTheMeeting.EName from Employees left join EmpAttendedTheMeeting on Employees.EName = EmpAttendedTheMeeting.EName", cn);
            DataTable dt = new DataTable();
            da.Fill(dt);
            foreach (DataRow dr in dt.Rows)
            {           
                dataGridView1.Rows.Add(dr[0], dr[1].ToString() == string.Empty ? false : true);
            }
        }   

    }
}

Im getting the result in my gridview like this. because sunny is not in EmpAttentendedTheMeeting, his name is unchecked

gridview

OTHER TIPS

Try changing j to i in the line near the bottom where you set the value

How about catching the existance of the record in the original SQL ? Something like

SELECT EmpID, EmpName, isnull(attended,0) FROM dbo.MY_TABLE m left outer join attended a on m.EmpID = a.EmpID

Forgive me if I'm wrong but this section of the code:

        for (int j=0; j < ds.Tables[0].Rows.Count; j++)
        {
            myDataGridView["Attended", j].Value = true;
            // Where "Attended" is the name of my CheckBox column
        }

Surely sets every row to true, doesn't it? You just want to set the specific row to true.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top