web-dev-qa-db-ja.com

列のDataGridViewで値を検索する

ユーザーがDataGridView(dgv)の列で数値を検索できるようにしたい。 dgvは多くのレコードを保持できます。各レコードにはプロジェクト番号があります。したがって、ユーザーが[プロジェクト番号]列でプロジェクト番号を検索できるようにしたいと思います。私が持っている列は次のとおりです。画像(ヘッダーテキストなし);プロジェクト番号;プロジェクト名;会社;連絡先。

これが私のコードです:

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);
    }
}

問題#1:これまでの処理:ユーザーがTextBox1にプロジェクト番号を入力します。ユーザーがボタンをクリックすると、コードは行でこの文字列を検索し、プロジェクト番号が見つかると、その行が選択されます。正常に動作しますが、1回だけです。他のプロジェクト番号を検索したいのですが、何も起こりません。

問題#2:これは、プロジェクト名のみの列の値を検索することで、より良い方法で実行できると思います。しかし、これを適切に行うにはどうすればよいですか?

検索に使用したコードは この答え からのものです

5
FJPoort

Row.Cells [row.Index]を使用する理由。検索する列のインデックスを指定する必要があります(問題#2)。たとえば、row.Cells [row.Index]をrow.Cells [2]に変更する必要があります。ここで、2は列のインデックスです。

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);
    }
}
19
Danilo Vulović

最初にDataTableを作成してから、DataGridViewDataSourceとして割り当てませんか。

DataTable table4DataSource=new DataTable();

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

...

(行を手動で、円で、またはデータベーステーブルからDataReaderを介して追加)(データソースを割り当てます)

dtGrdViewGrid.DataSource = table4DataSource;

次に使用します:

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

このコードをtextbox_textchangeイベントとフィルターされた値は、書き込み中に表示されます。

2
Rui Marques

ロジックを別のメソッド、または別のクラスに分離することもお勧めします。

このメソッドは、テキストが見つかったDataGridViewCellオブジェクトを取得するのに役立ちます。

    /// <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

DataTableまたはDatasetから直接データをフィルターします。

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

KeyUpのイベントTextboxでこのコードを使用し、テーブル名またはデータセットを「MyTable」に置き換え、検索を実行するフィールドを置き換えます。

0
Hull

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

データベース接続とデータテーブルとの関係はどうですか?また、DefaultViewを正しく設定するにはどうすればよいですか?

このコードを使用してデータを取得します。

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