Member 12786108 Ответов: 1

Datagridview аварийно завершает работу при нажатии на заголовок.


Если я нажму на заголовок своего datagridview, он выйдет из строя. Я понятия не имею, как это исправить. Я получаю эту ошибку:

Необработанное исключение типа System.Об произошло в mscorlib.dll

Дополнительная информация: индекс был вне диапазона. Должно быть неотрицательным и меньше размера коллекции.

В этот момент он рушится:
private void dgvProfiles_CellClick(object sender, DataGridViewCellEventArgs e)
        {   indexRow = e.RowIndex; // get the selected Row Index
            DataGridViewRow row = dgvProfiles.Rows[indexRow];
        }


Что я уже пробовал:

Я попытался отредактировать DataGridViewRow row = dgvProfiles.Строки[indexRow], но, кажется, ничего не работает.

namespace ProfileManager
{
    public partial class Form1 : Form

    {
        DataTable dt = new DataTable();
        private int indexRow;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            dt.Columns.AddRange(new DataColumn[8]
            {new DataColumn("ID", typeof(string)),
                new DataColumn("First Name", typeof(string)),
            new DataColumn("Last Name", typeof(string)),
           new DataColumn ("Phone", typeof(string)),
           new DataColumn("Email", typeof(string)),
           new DataColumn("City", typeof(string)),
           new DataColumn("State", typeof(string)),
           new DataColumn("Zip", typeof(string))});

        }

        private void btnAdd_Click(object sender, EventArgs e)
        {
            if (String.IsNullOrEmpty(txtID.Text))
            {
                MessageBox.Show("Please complete ID Name field.");
            }

            else if
                (String.IsNullOrEmpty(txtFirstName.Text))
            {
                MessageBox.Show("Please complete First Name field.");
            }

            else if (String.IsNullOrEmpty(txtLastName.Text))
            {
                MessageBox.Show("Please complete Last Name field.");
            }


            else if (String.IsNullOrEmpty(txtPhone.Text))
            {
                MessageBox.Show("Please complete Phone field.");
            }

            else if (String.IsNullOrEmpty(txtEmail.Text))
            {
                MessageBox.Show("Please complete Email field.");
            }

            else if (String.IsNullOrEmpty(txtCity.Text))
            {
                MessageBox.Show("Please complete City field.");
            }
            else if (String.IsNullOrEmpty(cbxState.Text))
            {
                MessageBox.Show("Please complete State field.");
            }
            else if (String.IsNullOrEmpty(txtZip.Text))
            {
                MessageBox.Show("Please complete Zip Code field.");
            }

            else {
                for (int row = 0; row < dgvProfiles.Rows.Count; row++)
                {
                    for (int col = 0; col < dgvProfiles.Columns.Count; col++)
                    {
                        if (dgvProfiles.Rows[row].Cells[col].Value != null &&
                          dgvProfiles.Rows[row].Cells[col].Value.Equals(txtEmail.Text.Trim()))
                        {
                            MessageBox.Show("Duplicate email was entered.");
                            return;
                        }

                        else if (dgvProfiles.Rows[row].Cells[col].Value != null &&
                          dgvProfiles.Rows[row].Cells[col].Value.Equals(txtID.Text.Trim()))
                        {
                            MessageBox.Show("Duplicate ID was entered.");
                            return;

                        }
                    }
                }

                dt.Rows.Add(txtID.Text, txtFirstName.Text, txtLastName.Text, txtPhone.Text, txtEmail.Text, txtCity.Text, cbxState.Text, txtZip.Text);
                this.dgvProfiles.DataSource = dt;
                txtID.Text = "";
                txtFirstName.Text = "";
                txtLastName.Text = "";
                txtPhone.Text = "";
                txtEmail.Text = "";
                txtPhone.Text = "";
                txtCity.Text = "";
                cbxState.SelectedIndex = -1;
                txtZip.Text = "";
                MessageBox.Show("Record was added successfully.");
            }

            

        }


        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }

        private void btnClear_Click(object sender, EventArgs e)
        {
            DialogResult dialog = MessageBox.Show("Are you sure you want to clear every field? All data will be lost!", "Clear", MessageBoxButtons.YesNo);
            if (dialog == DialogResult.Yes)
            {
                txtID.Text = "";
                txtFirstName.Text = "";
                txtLastName.Text = "";
                txtPhone.Text = "";
                txtEmail.Text = "";
                txtCity.Text = "";
                cbxState.SelectedIndex = -1;
                txtZip.Text = "";
                dt.Rows.Clear();
            }

            else {
                return;
            }

        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            DialogResult dialog = MessageBox.Show("Are you sure you want to close? All data will be lost!", "Exit", MessageBoxButtons.YesNo);
            if (dialog == DialogResult.Yes)
            {
                Application.Exit();
            }

            else
            {
                return;
            }
        }


        private void txtFirstName_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = !(char.IsLetter(e.KeyChar) || e.KeyChar == (char)Keys.Back);
        }

        private void txtLastName_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = !(char.IsLetter(e.KeyChar) || e.KeyChar == (char)Keys.Back);
        }

        private void txtCity_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = !(char.IsLetter(e.KeyChar) || e.KeyChar == (char)Keys.Back);
        }

        private void groupBox1_Enter(object sender, EventArgs e)
        {

        }

        private void btnDelete_Click(object sender, EventArgs e)
        {
            if (dgvProfiles.SelectedCells.Count <= 0)
            {
                MessageBox.Show("Please select a record you would like to delete.");
            }


            else {
                foreach (DataGridViewCell oneCell in dgvProfiles.SelectedCells)
                {
                    if (oneCell.Selected)
                    {
                        dgvProfiles.Rows.RemoveAt(oneCell.RowIndex);
                        MessageBox.Show("Record was deleted successfully!");
                        break;
                    }

                    else if (oneCell.RowIndex <= 0)
                    {
                        MessageBox.Show("Please select a record you would like to delete");
                    }
                }
                
            }

        }

        private void btnUpdate_Click(object sender, EventArgs e)
        {
            if (dgvProfiles.SelectedCells.Count <= 0)
            {
                MessageBox.Show("No record was selected to update.");
            }

            else {
                for (int row = 0; row < dgvProfiles.Rows.Count; row++)
                {
                    for (int col = 0; col < dgvProfiles.Columns.Count; col++)
                    {
                        if (dgvProfiles.Rows[row].Cells[col].Value != null &&
                          dgvProfiles.Rows[row].Cells[col].Value.Equals(txtEmail.Text.Trim()))
                        {
                            MessageBox.Show("Duplicate email was entered.");
                            return;
                        }

                        else if (dgvProfiles.Rows[row].Cells[col].Value != null &&
                          dgvProfiles.Rows[row].Cells[col].Value.Equals(txtID.Text.Trim()))
                        {
                            MessageBox.Show("Duplicate ID was entered.");
                            return;

                        }
                    }
                }
                DataGridViewRow newDataRow = dgvProfiles.Rows[indexRow];
                newDataRow.Cells[0].Value = txtID.Text;
                newDataRow.Cells[1].Value = txtFirstName.Text;
                newDataRow.Cells[2].Value = txtLastName.Text;
                newDataRow.Cells[3].Value = txtPhone.Text;
                newDataRow.Cells[4].Value = txtEmail.Text;
                newDataRow.Cells[5].Value = txtCity.Text;
                newDataRow.Cells[6].Value = cbxState.Text;
                newDataRow.Cells[7].Value = txtZip.Text;

            }
        }

        private void dgvProfiles_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            indexRow = e.RowIndex; // get the selected Row Index
            DataGridViewRow row = dgvProfiles.Rows[indexRow];

            txtID.Text = row.Cells[0].Value.ToString();
            txtFirstName.Text = row.Cells[1].Value.ToString();
            txtLastName.Text = row.Cells[2].Value.ToString();
            txtPhone.Text = row.Cells[3].Value.ToString();
            txtEmail.Text = row.Cells[4].Value.ToString();
            txtCity.Text = row.Cells[5].Value.ToString();
            cbxState.Text = row.Cells[6].Value.ToString();
            txtZip.Text = row.Cells[7].Value.ToString();

        }

        private void txtEmail_Validating(object sender, CancelEventArgs e)
        {
            System.Text.RegularExpressions.Regex rEMail = new System.Text.RegularExpressions.Regex(@"^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$");
            if (txtEmail.Text.Length > 0)
            {
                if (!rEMail.IsMatch(txtEmail.Text))
                {
                    MessageBox.Show("Email is required", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    txtEmail.SelectAll();
                    e.Cancel = true;
                }
            }
        }

        private void txtPhone_Validating(object sender, CancelEventArgs e)
        {
            System.Text.RegularExpressions.Regex rPhone = new System.Text.RegularExpressions.Regex(@"(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$");
            if (txtPhone.Text.Length > 0)
            {
                if (!rPhone.IsMatch(txtPhone.Text))
                {
                    MessageBox.Show("Valid phone number is required", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    txtPhone.SelectAll();
                    e.Cancel = true;
                }
            }
        }

        private void txtZip_Validating(object sender, CancelEventArgs e)
        {
            System.Text.RegularExpressions.Regex rZip = new System.Text.RegularExpressions.Regex(@"(^\d{5}(-\d{4})?$)|(^[ABCEGHJKLMNPRSTVXYabceghjklmnprstvxy]{1}\d{1}[ABCEGHJKLMNPRSTVWXYZabceghjklmnprstv‌​xy]{1} *\d{1}[ABCEGHJKLMNPRSTVWXYZabceghjklmnprstvxy]{1}\d{1}$)");
            if (txtZip.Text.Length > 0)
            {
                if (!rZip.IsMatch(txtZip.Text))
                {
                    MessageBox.Show("Valid zip is required. Must be in a 5 digit format.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    txtZip.SelectAll();
                    e.Cancel = true;
                }
            }

        }

        private void txtPhone_KeyPress(object sender, KeyPressEventArgs e)
        {
            char ch = e.KeyChar;
            if (!Char.IsDigit(ch) && ch != 8 && (e.KeyChar != '-'))
            {
                e.Handled = true;
            }
        }

        private void txtZip_KeyPress(object sender, KeyPressEventArgs e)
        {
            char ch = e.KeyChar;
            if (!Char.IsDigit(ch) && ch != 8)
            {
                e.Handled = true;
            }
        }

        private void txtID_KeyPress(object sender, KeyPressEventArgs e)
        {
            char ch = e.KeyChar;
            if (!Char.IsDigit(ch) && ch != 8)
            {
                e.Handled = true;
            }
        }
    }
}

[no name]

Мы не являемся сервисом "отладка всей моей кодовой базы". Что значит для вас крушение? Какие ошибки вы видите на своем экране?

Suvendu Shekhar Giri

Каковы наблюдения с помощью отладки?

ZurdoDev

Как уже упоминалось выше, сначала вы должны выполнить некоторые основные отладочные работы и устранить неполадки. Мы не можем запустить ваш код.

Member 12786108

Мое извинение. Добавил еще кое-какую информацию.

1 Ответов

Рейтинг:
8

Richard Deeming

Ошибка вполне понятна - ваш dgvProfiles_CellClick метод прошел RowIndex что недопустимо.

Это потому, что вы нажали на заголовок, а не на строку. То CellClick стреляет для обоих, и проходит RowIndex от -1 когда вы нажимаете на заголовок.

Измените свой код, чтобы игнорировать событие, когда вы нажимаете на заголовок:

private void dgvProfiles_CellClick(object sender, DataGridViewCellEventArgs e)
{
    if (e.RowIndex == -1) return;
    
    DataGridViewRow row = dgvProfiles.Rows[e.RowIndex];
    ...
}


Member 12786108

Я чувствую себя такой идиоткой! Не могу поверить, что полностью пропустила это! Спасибо.

Dave Kreskowiak

Отладчик существует для того, чтобы отлаживать вас, а не код. Он там, чтобы сказать вам, что ваше понимание кода должно быть исправлено. Только когда вы поймете код и почему он делает то, что делает, вы сможете его исправить.