Как я могу добавить текст из textbox.Text в datagridview.CurrentCell, когда datagridview фильтруется С#?

124
6

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

В основном я хочу, чтобы обновить конкретную ячейку, используя текстовое поле. Я написал следующий код, основанный на других сообщениях (ПРИМЕЧАНИЕ: DataBinding был выполнен с помощью мастера VS):

    int i;

private void textBox_TextChanged(object sender, EventArgs e)
{
i = dataGridView1.CurrentCell.RowIndex;
}

private void button1_Click(object sender, EventArgs e)
{
myDatabaseDataSet.Tables[0].Rows[i][5] = textBox.Text;
}

Проблема с приведенным выше кодом заключается в том, что когда я фильтрую dataGridView1 с помощью этого кода:

    private void comboName_SelectedIndexChanged(object sender, EventArgs e)
{
DataTableCollection tables = myDatabaseDataSet.Tables;
DataView view1 = new DataView(tables[0]);
BindingSource source1 = new BindingSource();
source1.DataSource = view1;
dataGridView1.DataSource = source1;
source1.Filter = "Name='" + comboName.Text.Replace("'", "''") + "'";
}

Код обновит dataGridView1.CurrentCell.RowIndex, как ожидалось. Большая проблема здесь в том, что код под button1_Click не видит фильтрацию, поэтому он будет писать -for example- в строке [1] нефильтрованной таблицы, а не в строке [1] отфильтрованной таблицы.

Любая помощь будет принята с благодарностью.

спросил(а) 2021-01-25T16:02:46+03:00 4 месяца, 3 недели назад
1
Решение
108

Основываясь на коде, вы создаете копию исходной таблицы. Вместо обновления отфильтрованной таблицы вы обновляете исходную таблицу myDatabaseDataSet.Tables[0].Rows[i][5] = textBox.Text; ,

Исправление очевидно, я дам вам некоторую идею здесь...

private void button1_Click(object sender, EventArgs e)
{
myDatabaseDataSet.Tables[0].Rows[i][5] = textBox.Text; // You need to modify this to know which is the correct row to update.
// Update the filtered table every time you update the main table.
DataTableCollection tables = myDatabaseDataSet.Tables;
DataView view1 = new DataView(tables[0]);
BindingSource source1 = new BindingSource();
source1.DataSource = view1;
dataGridView1.DataSource = source1;
source1.Filter = "Name='" + comboName.Text.Replace("'", "''") + "'";
}

Удачи.

ответил(а) 2021-01-25T16:02:46+03:00 4 месяца, 3 недели назад
45

Прежде всего, вам нужно будет найти уникальный столбец, уникальный для каждой строки. то вы можете выбрать dataRow вашего набора данных на основе следующего:

int uniqueIDFromDatagrid = (int)dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[uniqueIdentifierColumn.Index].Value;
DataRow targetRow = myDataSet.Tables[0].Rows.OfType<DataRow>().First(x => (int)x["uniqueIdentifierColumn"]== uniqueIDFromDatagrid);

а затем вы можете обновить источник в правой строке и столбце следующим образом:

targetRow[5] = textBox1.Text;

ответил(а) 2021-01-25T16:02:46+03:00 4 месяца, 3 недели назад
45

Я не совсем понимаю ваш вопрос

Вы имеете в виду, что фильтр не применяется, когда вы изменили текст ячейки?

Попробуйте добавить это к событию нажатия кнопки

(myDatabaseDataSet.DataSource as DataTable).DefaultView.RowFilter = "Name='" + comboName.Text.Replace("'", "''") + "'";

ответил(а) 2021-01-25T16:02:46+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема