当datagridview被过滤C#时,如何将textbox.Text中的文本添加到datagridview.CurrentCell?

时间:2016-09-26 02:27:39

标签: c# winforms datagridview

我不擅长编码,经过无数次的研究后,我无法理解这一点。

基本上我想要实现的是使用textBox更新特定单元格。我根据其他帖子编写了以下代码(注意: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下的代码没有看到过滤,因此它会在未过滤表的行[1]中而不是在过滤表的行[1]中写入 - 例如 - 。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:0)

我不太明白你的问题

您是否意味着更改单元格文本时过滤器不适用?

尝试将其添加到按钮点击事件

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

答案 1 :(得分:0)

根据您的代码,您可以创建原始表的副本。您不必更新已过滤的表,而是更新原始表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("'", "''") + "'";
}
祝你好运。

答案 2 :(得分:0)

首先,您必须找到一个独特的列,每列都是唯一的。 然后您可以根据以下内容选择数据集的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;