Я хочу, чтобы 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.
Я нашел обходной путь на этой странице, хотя я не знаю, почему он работает
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...
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;
}
}
}