What happens is if I have codes inside listBox1_SelectedIndexChanged method, the UI gets stuck every time I press the Add Cash, Save or Refresh Button.
It works fine if I remove the codes inside listBox1_SelectedIndexChanged.
        private void LoadAccounts()
        {
            accounts.Clear();
            accounts = DBAccess.LoadAccounts();
            UpdateListBox();
        }
        private void UpdateListBox()
        {
            listBox1.DataSource = null;
            listBox1.DataSource = accounts;
            listBox1.DisplayMember = "Username";
        }
        private void btnAddCash_Click(object sender, EventArgs e)
        {
            string userName = listBox1.GetItemText(listBox1.SelectedItem);
            if ( Int32.TryParse(txtAddCash.Text, out int cash) )
            {
                DialogResult dr = MessageBox.Show($"Add {txtAddCash.Text} cash to {userName}?", "Add Cash", MessageBoxButtons.YesNo);
                if (dr == DialogResult.No)
                    return;
                AccountModel acc = new AccountModel();
                acc.Username = userName;
                acc.LeftCash = cash;
                DBAccess.AddCash(acc);
                txtAddCash.Text = "";
                LoadAccounts();
            }
        }
        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            string selected = ((AccountModel)listBox1.SelectedItem).Username;
            int leftCash = accounts.Where(a => a.Username == selected).Select(a => a.LeftCash).First();
            lblLeftCash.Text = leftCash.ToString();
        }
I made a short clip on what happens

It's like the updated UI is behind the old listbox UI