-1

我有一个加载了 csv 文件的 gridview。我需要遍历时间和日期列,因此当用户选择行时,它将在不同行中找到下一个日期和时间。所以,那个老板可以看到那个人工作了多少小时。我需要从“A02 - 后门(比如登录或打卡)中找到总小时数,这个循环需要在 10 小时的时间跨度后找到最后一扇门。请帮忙。

public partial class Form1 : Form
{
    public const string RearEntranceDoor = "AO2 - Rear Entrance";
    public const string ExteriorMainFloorDoor = "B12 - Exterior Main Floor Man Trap";
    public const string InteriorMainFloorDoor = "B12 - Interior Main Floor Man Trap";
    public const string RearBreakRoomDoor = "C13 - Rear Break Room Door";
    public const string ExteriorBasementDoor = "B02 - Exterior Basement Man Trap";
    public const string InteriorBasementDoor = "B02 - Interior Basement Man Trap";
    public const string ManagedServicesDoor = "D01 - Managed Services Main door";
    public const string ManagedServiceBigDoor = "D01 - Managed Services Big Door";
    public const  TimeSpan midnightShift = TimeSpan.Parse("20:00:00");
    public const TimeSpan midnightShift2 = TimeSpan.Parse("07:00:00");
    public const TimeSpan middayShift = TimeSpan.Parse("09:30:00");
    public const TimeSpan middayShift2 = TimeSpan.Parse("20:30:00");
    public const TimeSpan middayShift3 = TimeSpan.Parse("09:30:00");
    public const TimeSpan middayShift4 = TimeSpan.Parse("21:30:00");
    public const TimeSpan morningShift = TimeSpan.Parse("07:00:00");
    public const TimeSpan morningShift2 = TimeSpan.Parse("19:00:00");



    List<PersonEntered> peopleEntering;
    List<WorkSpan> workSpans;


    public Form1()
    {
        InitializeComponent();
       TurnOffLabelsandPanels();
        peopleEntering = new List<PersonEntered>();
        workSpans = new List<WorkSpan>();

    }


    private void csvButton_Click(object sender, EventArgs e)
    {
        string delimiter = ",";
        string tablename = "Csvfile";
        DataSet dataset = new DataSet();

        OpenFileDialog csvOpenFileDialog1 = new OpenFileDialog();
        csvOpenFileDialog1.Filter = "CSV Files (*.csv)|*.csv|All Files (*.*)|*.*";
        csvOpenFileDialog1.FilterIndex = 1;
        if (csvOpenFileDialog1.ShowDialog() == DialogResult.OK)
        {
            if (MessageBox.Show("Are you sure you want to import the data from \n " + csvOpenFileDialog1.FileName + "?", "Are you sure?", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                filename = csvOpenFileDialog1.FileName;
                StreamReader sr = new StreamReader(filename);
                string csv = File.ReadAllText(csvOpenFileDialog1.FileName);


                string allData = sr.ReadToEnd();
                string[] rows = allData.Split("\n".ToCharArray());


                bool header = true;


                foreach (string r in rows)
                {
                    string[] items = r.Split(delimiter.ToCharArray());


                    if (header)
                    {
                        dataset.Tables.Add(tablename);
                        dataset.Tables[tablename].Columns.Add(items[0]);//Sequence\\
                        dataset.Tables[tablename].Columns.Add(items[1]);//Date and Time\\
                        dataset.Tables[tablename].Columns.Add(items[2]);//Event message\\
                        dataset.Tables[tablename].Columns.Add(items[3]);//Event number\\
                        dataset.Tables[tablename].Columns.Add(items[4]);//Object #1\\
                        dataset.Tables[tablename].Columns.Add(items[5]);//doors\\
                        dataset.Tables[tablename].Columns.Add(items[6]);//Object #2\\
                        dataset.Tables[tablename].Columns.Add(items[7]);//Employee name\\
                        dataset.Tables[tablename].Columns.Add(items[8]);//Object #3\\
                        dataset.Tables[tablename].Columns.Add(items[9]);//Description #3\\
                        dataset.Tables[tablename].Columns.Add(items[10]);//Object #4\\
                        dataset.Tables[tablename].Columns.Add(items[11]);//Description #4\\
                        dataset.Tables[tablename].Columns.Add(items[12]);//keycard\\



                        header = false;
                    }
                    else
                    {
                        if (!String.IsNullOrEmpty(items[0]))
                        {
                            dataset.Tables[tablename].Rows.Add(items);
                        }
                    }
                    foreach (DataRow dr in dataset.Tables[0].Rows)
                    {
                        string dateAndTime = dr["Date and Time"].ToString();
                        string personName = dr["Description #2"].ToString();
                        string doorType = dr["Description #1"].ToString();

                        DateTime dateEntered = Convert.ToDateTime(dateAndTime);
                        DoorType doorTypeEnum;

                        bool personExists = false;
                        foreach (object name in listboxOfNames.Items)
                        {
                            if (name.ToString() == personName)
                            {
                                personExists = true;
                                break;
                            }
                        }
                        if (!personExists)
                        {
                            listboxOfNames.Items.Add(personName);
                        }
                        switch (doorType)
                        {
                            case "A02 - Rear Entrance":
                                doorTypeEnum = DoorType.RearEntranceDoor;
                                break;
                            case "B12 - Exterior Main Floor Man Trap":
                                doorTypeEnum = DoorType.ExteriorMainFloorDoor;
                                break;
                            case "B12 - Interior Main Floor Man Trap":
                                doorTypeEnum = DoorType.InteriorMainFloorDoor;
                                break;
                            case "C13 - Rear Break Room Door":
                                doorTypeEnum = DoorType.RearBreakRoomDoor;
                                break;
                            case "B02 - Exterior Basement Man Trap":
                                doorTypeEnum = DoorType.ExteriorBasementDoor;
                                break;
                            case "B02 - Interior Basement Man Trap":
                                doorTypeEnum = DoorType.InteriorBasementDoor;
                                break;
                            case "D01 - Managed Services Main door":
                                doorTypeEnum = DoorType.ManagedServicesDoor;
                                break;
                            case "D01 - Managed Services Big Door":
                                doorTypeEnum = DoorType.ManagedServicesBigDoor;
                                break;
                            default:
                                doorTypeEnum = DoorType.None;
                                break;
                        }



                        peopleEntering.Add(new PersonEntered(personName, dateEntered, doorTypeEnum));

                    }

                }
                for (int i = 0; i < peopleEntering.Count; i++)
                {
                    DateTime startDate = new DateTime();
                    DateTime endDate = new DateTime();
                    string personName = peopleEntering[i].PersonName;
                    if (peopleEntering[i].DoorEntered == DoorType.RearEntranceDoor)
                    {
                        startDate = peopleEntering[i].DateOfEntry;
                        for (int j = i + 1; j < peopleEntering.Count; j++)
                        {
                            if (peopleEntering[j].DoorEntered == DoorType.ExteriorBasementDoor && peopleEntering[j].PersonName == personName)
                            {                                  

                                    endDate = peopleEntering[j].DateOfEntry;

                            }
                        }
                    }

                    workSpans.Add(new WorkSpan(personName, startDate, endDate));
                }

                TurnOnLabels();
                this.csvGridView.DataSource = dataset.Tables[0].DefaultView;


                MessageBox.Show(filename + " was successfully imported. \n ", "Success!", MessageBoxButtons.OK);


            }
            else
            {
                this.Close();
            }
        }

    }
    public string filename { get; set; }

    private void csvGridView_CellClick(object sender, DataGridViewCellEventArgs e)
    {
         int i;

             i = csvGridView.SelectedCells[0].RowIndex;
             csvGridView.Columns[2].Visible = false;
             csvGridView.Columns[3].Visible = false;
             csvGridView.Columns[4].Visible = false;
             csvGridView.Columns[6].Visible = false;
             csvGridView.Columns[8].Visible = false;
             csvGridView.Columns[9].Visible = false;
             csvGridView.Columns[10].Visible = false;
             csvGridView.Columns[11].Visible = false;
             CsvInfoPanel.Visible = true;
             firstLastNameLbl.Text = csvGridView.Rows[i].Cells[7].Value.ToString();
             keyCardNumberLbl.Text = csvGridView.Rows[i].Cells[12].Value.ToString();
             timeDateEntryLbl.Text = csvGridView.Rows[i].Cells[1].Value.ToString();
             dateTimeDepartureLbl.Text = csvGridView.Rows[17].Cells[1].Value.ToString();
             DateTime startDate = Convert.ToDateTime(csvGridView.Rows[i].Cells[1].Value.ToString());
             DateTime endDate = Convert.ToDateTime(csvGridView.Rows[17].Cells[1].Value.ToString());
             TimeSpan difference = endDate - startDate;
             keyedInHoursLbl.Text = 





        string personName = csvGridView.Rows[i].Cells[0].Value.ToString();

        List<WorkSpan> listOfWorkSpans = new List<WorkSpan>();

        for (int j = 0; j < workSpans.Count; j++)
        {
            if (workSpans[j].PersonName == personName)
            {
                listOfWorkSpans.Add(workSpans[j]);
            }
        }

    }

    private void listboxOfNames_SelectedIndexChanged(object sender, EventArgs e)
    {
        TurnOnPanel();

        string personName = listboxOfNames.Items[listboxOfNames.SelectedIndex].ToString();

        List<WorkSpan> listOfWorkSpan = new List<WorkSpan>();

        foreach (WorkSpan workSpan in workSpans)
        {
            if (workSpan.PersonName == personName)
            {
                listOfWorkSpan.Add(workSpan);


            }
        }
        int b;



         //create TimeSpan object

        b = csvGridView.SelectedCells[0].RowIndex;
        csvGridView.DataSource = listOfWorkSpan;
        firstLastNameLbl.Text = csvGridView.Rows[b].Cells[0].Value.ToString();
        timeDateEntryLbl.Text = csvGridView.Rows[b].Cells[1].Value.ToString();
        dateTimeDepartureLbl.Text = csvGridView.Rows[b].Cells[2].Value.ToString();
        DateTime startDate = System.Convert.ToDateTime(csvGridView.Rows[b].Cells[1].Value.ToString());
        DateTime endDate = System.Convert.ToDateTime(csvGridView.Rows[b].Cells[2].Value.ToString());
        TimeSpan difference = endDate - startDate;
        keyedInHoursLbl.Text = hoursOfShift.ToString();
    }

    private void TurnOnLabels()
    {
        csvGridView.Visible = true;
        EmployeeNameLbl.Visible = true;
        keycardLbl.Visible = true;
        dateTimeEntryLbl.Visible = true;
        dateTimeExitedLbl.Visible = true;
        hoursClockedInLbl.Visible = true;
        firstLastNameLbl.Visible = true;
        keyCardNumberLbl.Visible = true;
        timeDateEntryLbl.Visible = true;
        dateTimeDepartureLbl.Visible = true;
        keyedInHoursLbl.Visible = true;
        listboxOfNames.Visible = true;
        nameSelectionLbl.Visible = true;          

    }
    private void TurnOnPanel()
    {
        CsvInfoPanel.Visible = true;
        EmployeeNameLbl.Visible = true;
        dateTimeEntryLbl.Visible = true;
        dateTimeExitedLbl.Visible = true;
        firstLastNameLbl.Visible = true;
        timeDateEntryLbl.Visible = true;
        dateTimeDepartureLbl.Visible = true;
        keycardLbl.Visible = false;
        keyCardNumberLbl.Visible = false;
    }
    private void TurnOffLabelsandPanels()
    {
        csvGridView.Visible = false;
        EmployeeNameLbl.Visible = false;
        keycardLbl.Visible = false;
        dateTimeEntryLbl.Visible = false;
        dateTimeExitedLbl.Visible = false;
        hoursClockedInLbl.Visible = false;
        firstLastNameLbl.Visible = false;
        keyCardNumberLbl.Visible = false;
        timeDateEntryLbl.Visible = false;
        dateTimeDepartureLbl.Visible = false;
        keyedInHoursLbl.Visible = false;
        listboxOfNames.Visible = false;
        nameSelectionLbl.Visible = false;
        CsvInfoPanel.Visible = false;
    }
    private void closeButton_Click(object sender, EventArgs e)
    {
        this.Close();
    }


}


    public enum DoorType
    {
        None = 0,
        RearEntranceDoor = 1,
        ExteriorMainFloorDoor = 2,
        InteriorMainFloorDoor = 3,
        RearBreakRoomDoor = 4,
        ExteriorBasementDoor = 5,
        InteriorBasementDoor = 6,
        ManagedServicesDoor = 7,
        ManagedServicesBigDoor = 8
    }
}    
4

1 回答 1

0

单击您的行后,检索您的 DateTime 值。然后遍历其余行(或 LINQ 查询)以查找具有您要查找的“下一个”日期时间值的下一行。

编辑:在您的 csvGridView_CellClick 方法中,您检索被单击的单元格的行索引。如果您需要在 10 小时后找到该人的下一次匹配项,请从当前行获取 startDate,您已经在执行此操作。完成后,调用一个名为“LocateNextEntryForPersonAtXDateTime(string personName, string targetDateTime)”的新方法,如下所示:

private int LocateNextEntryForPersonAtXDateTime(string personName, DateTime targetDateTime)
{
  for (int i = 1; i <= csvGridView.Rows.Count; i++)
  {
     if (csvGridView.Rows[i][0].Value.ToString().ToLower() == personName.ToLower()
       && Convert.ToDateTime(csvGridView.Cells[i][1].Value) >= targetDateTime)
         return i; // this is the row for the next entry when the person leaves
  }

  return -1; // not found
}
于 2013-08-01T15:19:46.243 回答