Бросок DataGridView “InvalidOperationException: Операция не является допустимым …” при добавлении строки

Я хочу, чтобы OpenFileDialog подошел, когда пользователь нажимает на ячейку, затем отобразите результат в ячейке.

Все это работает, за исключением того, что DataGridView отображает дополнительную строку для добавления значений к списку, с которым это связывается. Строка обнаруживается если dataGridView.AllowUserToAddNewRows == true, который является тем, что я хочу. То, что я не хочу, - чтобы приложение отказало, когда та строка редактируется программно; вместо этого, это должно сделать точно, что это сделало бы, если пользователь отредактировал ту строку вручную (добавьте новую строку к базовому списку, продвиньте другую пустую строку на сетку для добавления значений).

Я читал о SendKeys. Отправьте (), который должен заставить DataGridView вести себя точно, как будто пользователь ввел значение; однако, это не работает также. Вот то, что я пробую:

if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
    dataGridView1.CurrentCell = cell;

    //simply doing a cell.Value = etc. will cause the program to crash
    cell.ReadOnly = false;
    dataGridView1.Columns[cell.ColumnIndex].ReadOnly = false;
    dataGridView1.EditMode = DataGridViewEditMode.EditOnEnter;
    dataGridView1.BeginEdit(true);
    SendKeys.Send(openFileDialog1.FileName + "{Enter}");
    dataGridView1.EndEdit();
    cell.ReadOnly = true;
    dataGridView1.Columns[cell.ColumnIndex].ReadOnly = true;
}
//I would expect the FileName would be in the cell now, and a new empty
//row tacked onto the end of the DataGridView, but it's not; the DataGridView
//is not changed at all.
16
задан BlueRaja - Danny Pflughoeft 12 March 2010 в 20:09
поделиться

2 ответа

Я нашел обходной путь на этой странице, хотя я не знаю, почему он работает

public MyForm()
{
    InitializeComponent();
    //Create a BindingSource, set its DataSource to my list,
    //set the DataGrid's DataSource to the BindindingSource...
    _bindingSource.AddingNew += OnAddingNewToBindingSource;
}

private void OnAddingNewToBindingSource(object sender, AddingNewEventArgs e)
{
    if(dataGridView1.Rows.Count == _bindingSource.Count)
    {
        _bindingSource.RemoveAt(_bindingSource.Count - 1);
    }
}

Мне становится очень тошно тратить так много времени на борьбу с ошибками Visual Studio...

17
ответ дан 30 November 2019 в 17:39
поделиться

Try this:

        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            int row = e.RowIndex;
            int clmn = e.ColumnIndex;
            if(e.RowIndex == dataGridView1.Rows.Count- 1)
                dataGridView1.Rows.Add();
            dataGridView1.Rows[row].Cells[clmn].Value = openFileDialog1.FileName;
        }

EDIT Я не заметил, что вы привязываете свой datagridview :( Хорошо, чтобы решить это: используйте источник привязки, установите его свойство DataSource на ваш список, затем установите источник данных представления грида данных на этот источник привязки. Теперь код должен выглядеть так:

public partial class frmTestDataGridView : Form
    {
        BindingSource bindingSource1 = new BindingSource();
        List<string> datasource = new List<string>();
        public frmTestDataGridView()
        {
            InitializeComponent();
            datasource.Add("item1");
            datasource.Add("item2");
            datasource.Add("item3");

            bindingSource1.DataSource = datasource;
            dataGridView1.DataSource = bindingSource1;
        }

        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                int row = e.RowIndex;
                int clmn = e.ColumnIndex;

                if (e.RowIndex == dataGridView1.Rows.Count - 1)
                {
                    bindingSource1.Add("");
                }
                dataGridView1.Rows[row].Cells[clmn].Value = openFileDialog1.FileName;
            }
        }

    }
1
ответ дан 30 November 2019 в 17:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: