web-dev-qa-db-de.com

Suchen Sie in einer Spalte nach einem Wert in DataGridView

Ich möchte, dass der Benutzer in der DataGridView (dgv) nach einer Nummer in einer Spalte suchen kann. Der dgv kann viele Datensätze enthalten. Jeder Datensatz hat eine Projektnummer. Ich möchte, dass der Benutzer in der Spalte Projektnummer nach einer Projektnummer suchen kann. Die Spalten, die ich habe, sind: ProjectID (nicht sichtbar); Bild (kein Headertext); Projektnummer; Projektname; Unternehmen; Kontakt.

Hier ist mein Code:

private void btnSearch_Click(object sender, EventArgs e)
{
    string searchValue = textBox1.Text;
    int rowIndex = -1;

    dgvProjects.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
    try
    {
        foreach (DataGridViewRow row in dgvProjects.Rows)
        {
            if (row.Cells[row.Index].Value.ToString().Equals(searchValue))
            {
                rowIndex = row.Index;
                dgvProjects.Rows[row.Index].Selected = true;
                break;
            }
        }
    }
    catch (Exception exc)
    {
        MessageBox.Show(exc.Message);
    }
}

Problem # 1: Was es bisher getan hat: Der Benutzer gibt die Projektnummer in TextBox1 ein. Wenn er auf die Schaltfläche klickt, sucht der Code in den Zeilen nach dieser Zeichenfolge. Wenn die Projektnummer gefunden wurde, wird diese Zeile ausgewählt. Es funktioniert gut, aber nur einmal. Wenn ich nach einer anderen Projektnummer suchen möchte, passiert nichts.

Problem Nr. 2: Ich denke, dies lässt sich besser tun, indem nur die Werte für die Spalte Projektname durchsucht werden. Aber wie soll ich das richtig machen?

Der Code, den ich suchte, stammt von diese Antwort

4
FJPoort

Warum verwenden Sie row.Cells [row.Index]. Sie müssen den Index der zu durchsuchenden Spalte angeben (Problem Nr. 2). Beispielsweise müssen Sie row.Cells [row.Index] in row.Cells [2] ändern, wobei 2 der Index Ihrer Spalte ist:

private void btnSearch_Click(object sender, EventArgs e)
{
    string searchValue = textBox1.Text;

    dgvProjects.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
    try
    {
        foreach (DataGridViewRow row in dgvProjects.Rows)
        {
            if (row.Cells[2].Value.ToString().Equals(searchValue))
            {
                row.Selected = true;
                break;
            }
        }
    }
    catch (Exception exc)
    {
        MessageBox.Show(exc.Message);
    }
}
17
Danilo Vulović

Es ist auch besser, Ihre Logik in einer anderen Methode oder vielleicht in einer anderen Klasse zu trennen.

Diese Methode hilft Ihnen, das DataGridViewCell-Objekt, in dem der Text gefunden wurde, abzurufen.

    /// <summary>
    /// Check if a given text exists in the given DataGridView at a given column index
    /// </summary>
    /// <param name="searchText"></param>
    /// <param name="dataGridView"></param>
    /// <param name="columnIndex"></param>
    /// <returns>The cell in which the searchText was found</returns>
    private DataGridViewCell GetCellWhereTextExistsInGridView(string searchText, DataGridView dataGridView, int columnIndex)
    {
        DataGridViewCell cellWhereTextIsMet = null;

        // For every row in the grid (obviously)
        foreach (DataGridViewRow row in dataGridView.Rows)
        {
            // I did not test this case, but cell.Value is an object, and objects can be null
            // So check if the cell is null before using .ToString()
            if (row.Cells[columnIndex].Value != null && searchText == row.Cells[columnIndex].Value.ToString())
            {
                // the searchText is equals to the text in this cell.
                cellWhereTextIsMet = row.Cells[columnIndex];
                break;
            }
        }

        return cellWhereTextIsMet;
    }

    private void button_click(object sender, EventArgs e)
    {
        DataGridViewCell cell = GetCellWhereTextExistsInGridView(textBox1.Text, myGridView, 2);
        if (cell != null)
        {
            // Value exists in the grid
            // you can do extra stuff on the cell
            cell.Style = new DataGridViewCellStyle { ForeColor = Color.Red };
        }
        else
        {
            // Value does not exist in the grid
        }
    }
1
achehab
//     This is the exact code for search facility in datagridview.
private void buttonSearch_Click(object sender, EventArgs e)
{
    string searchValue=textBoxSearch.Text;
    int rowIndex = 1;  //this one is depending on the position of cell or column
    //string first_row_data=dataGridView1.Rows[0].Cells[0].Value.ToString() ;

    dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
    try
    {
        bool valueResulet = true;
        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            if (row.Cells[rowIndex].Value.ToString().Equals(searchValue))
            {
                rowIndex = row.Index;
                dataGridView1.Rows[rowIndex].Selected = true;
                rowIndex++;
                valueResulet = false;
            }
        }
        if (valueResulet != false)
        {
            MessageBox.Show("Record is not avalable for this Name"+textBoxSearch.Text,"Not Found");
            return;
        }
    }
    catch (Exception exc)
    {
        MessageBox.Show(exc.Message);
    }
}
0
KB Gowda

Warum bauen Sie nicht zuerst eine DataTable, dann weisen Sie sie der DataGridView als DataSource zu:

DataTable table4DataSource=new DataTable();

table4DataSource.Columns.Add("col00");
table4DataSource.Columns.Add("col01");
table4DataSource.Columns.Add("col02");

...

(Fügen Sie Ihre Zeilen manuell, in einem Kreis oder über eine DataReader aus einer Datenbanktabelle hinzu.) (weisen Sie die Datenquelle zu).

dtGrdViewGrid.DataSource = table4DataSource;

und dann verwenden Sie:

(dtGrdViewGrid.DataSource as DataTable).DefaultView.RowFilter = "col00 = '" + textBoxSearch.Text+ "'";
dtGrdViewGrid.Refresh();

Sie können diesen Code sogar in Ihr textbox_textchange-Ereignis einfügen, und Ihre gefilterten Werte werden beim Schreiben angezeigt.

0
Rui Marques

Filtern Sie die Daten direkt aus DataTable oder Dataset:

"MyTable".DefaultView.RowFilter = "<DataTable Field> LIKE '%" + textBox1.Text + "%'";
   this.dataGridView1.DataSource = "MyTable".DefaultView;

Verwenden Sie diesen Code für das Ereignis KeyUp von Textbox, ersetzen Sie "MyTable" für Ihren Tabellennamen oder Ihre Datenmenge, ersetzen Sie das Feld, in dem Sie die Suche durchführen möchten.

0
Hull

"MyTable" .DefaultView.RowFilter = "LIKE '%" + textBox1.Text + "%" "; This.dataGridView1.DataSource =" MyTable ".DefaultView; 

Wie wäre es mit dem Bezug zu den Datenbankverbindungen und der Datatelefonie? Und wie muss ich das DefaultView richtig einstellen?

Ich benutze diesen Code, um die Daten herauszuholen:

con = new System.Data.SqlServerCe.SqlCeConnection();
con.ConnectionString = "Data Source=C:\\Users\\mhadj\\Documents\\Visual Studio 2015\\Projects\\data_base_test_2\\Sample.sdf";
con.Open();

DataTable dt = new DataTable();

adapt = new System.Data.SqlServerCe.SqlCeDataAdapter("select * from tbl_Record", con);        
adapt.Fill(dt);        
dataGridView1.DataSource = dt;
con.Close();
0