1

私が書いたプログラムはレジスターで、バーコードがスキャンされると、データベースに移動し、人物の名前と ID 番号を引き出し、スキャンした時刻の「Time In:」もリストします。 2 回目にスキャンすると、次のように「タイムアウト:」という部分が追加されます。

Peters, Alastair (242242) Time In : 14:50 Time Out : 14:50 Time In : 14:50

私が探しているのは、最初にスキャンしたときに次のように表示されることです。

Peters, Alastair (242242) Time In : 14:50

2 回目にスキャンすると、行全体が追加され、Time Out :行全体が削除されて 2 番目のリストボックスに保存されるため、人がいない場合は表示されません。

そして、人が(3回目)スキャンすると、前の行が再リストされますが、新しいTime In

提案やアイデアは非常に役に立ちます!

これが私のコードです:

    private string CreateNewEntry(string current)
    {
        var indexIn = current.LastIndexOf("Time In : "); // Get the last index of the word "in"
        var indexOut = current.LastIndexOf("Time Out : "); // Get the last index of the word out

        if (indexOut > indexIn)
        {
            return current + "      "+"Time In : "; // if the last "out" comes after the last "in"
        }
        else
        {
            // If the last "in" comes after the last "out"
            return current + "      " +"Time Out : ";
        }
    }

    private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        SqlConnection DBConnection = new SqlConnection("Data Source=DATABASE;Initial Catalog=imis;Integrated Security=True");
        SqlCommand cmd = new SqlCommand();

        Object returnValue;

        string txtend = textBox1.Text;

        if (e.KeyChar == 'L')
        {
            DBConnection.Open();
        }
        if (DBConnection.State == ConnectionState.Open)
        {
            if (textBox1.Text.Length != 6) return;
            {
                cmd.CommandText = ("SELECT last_name +', '+ first_name from name where id =@Name");
                cmd.Parameters.Add(new SqlParameter("Name", textBox1.Text.Replace(@"L", "")));
                cmd.CommandType = CommandType.Text;
                cmd.Connection = DBConnection;

                returnValue = cmd.ExecuteScalar() + "\t (" + textBox1.Text.Replace(@"L", "") + ")";

                DBConnection.Close();

                bool found = false;

                foreach (var item in listBox1.Items)
                {
                    var entry = item.ToString();
                    if (entry.Contains(returnValue.ToString()))
                    {
                        listBox1.Items.Remove(item);
                        listBox1.Items.Add(CreateNewEntry(entry) + DateTime.Now.ToString("HH:mm"));
                        found = true;
                        break;
                    }
                }

                if (!found)
                {
                    listBox1.Items.Add(returnValue + "      " + "Time In : " + DateTime.Now.ToString("HH:mm"));
                }

                textBox1.Clear();

                System.IO.StreamWriter SaveFile = new System.IO.StreamWriter(fullFileName);
                foreach (object item in listBox1.Items)
                SaveFile.WriteLine(item.ToString());
                SaveFile.Flush();
                SaveFile.Close();

                if (listBox1.Items.Count != 0) { DisableCloseButton(); }
                else
                {
                    EnableCloseButton();
                }
                Current_Attendance_Label.Text = "Currently " + listBox1.Items.Count.ToString() + " in attendance.";
                e.Handled = true;
            }
        }
4

1 に答える 1

0

開始ビット (例: "Peters, Alastair (242242)") は一意であり、一定のままであることを理解しています。その場合は、 を使用できますFindString。サンプルコード:

int curIndex = listBox1.FindString("Peters, Alastair (242242)");
string wholePetersRecord = "";
if (curIndex >= 0)
{
    wholePetersRecord = listBox1.Items[curIndex].ToString();
    listBox1.Items.RemoveAt(curIndex);
}

このコードは、wholePetersRecord"Peters, Alastair (242242)" ("Peters, Alastair (242242) Time In : 14:50 Time Out : 14:50 Time In : 14:50",例えば)。

于 2013-10-03T14:45:01.850 に答える