64

データベース情報を使用してバインドされた SystemId、FirstName、LastName の 3 つの列を持つ dataGridView があります。特定の行を強調表示したいと思います。これは、次を使用して行います。

dataGridView1.Rows[????].Selected = true;

ただし、行IDがわからず、バインディングソースが変化し続けるため、行10はあるインスタンスでは「ジョン・スミス」である可能性がありますが、別のインスタンスには存在しません(ユーザーが入力した内容に基づいてソースを除外するフィルターがあるため、次のように入力しますin "joh" と入力すると、姓名に "joh" が含まれるすべての行が生成されるため、私のリストは 1 回のクリックで 50 名から 3 名に移動できます)。

SystemId と対応する番号に基づいて行を選択する方法を見つけたいです。次の方法でシステム ID を取得できます。

systemId = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["SystemId"].Value.ToString();

これを行セレクターに適用するだけです。dataGridView1.Columns["SystemId"].IndexOf(systemId} のようなものですが、それは機能しません (そのような方法も存在しません)。

4

7 に答える 7

173

これにより、値のグリッドビュー行インデックスが得られます。

String searchValue = "somestring";
int rowIndex = -1;
foreach(DataGridViewRow row in DataGridView1.Rows)
{
    if(row.Cells[1].Value.ToString().Equals(searchValue))
    {
        rowIndex = row.Index;
        break;
    }
}

またはLINQクエリ

int rowIndex = -1;

DataGridViewRow row = dgv.Rows
    .Cast<DataGridViewRow>()
    .Where(r => r.Cells["SystemId"].Value.ToString().Equals(searchValue))
    .First();

rowIndex = row.Index;

次に、次のことができます。

dataGridView1.Rows[rowIndex].Selected = true;
于 2012-04-16T18:07:58.437 に答える
25

上記の回答は、AllowUserToAddRowsが に設定されている場合にのみ機能しfalseます。そのプロパティが に設定されている場合、ループまたは Linq クエリが新しい行をネゴシエートしようとすると、trueが返されます。NullReferenceException上記の受け入れられた2つの回答を変更して、を処理しAllowUserToAddRows = trueました。

ループの答え:

String searchValue = "somestring";
int rowIndex = -1;
foreach(DataGridViewRow row in DataGridView1.Rows)
{
    if (row.Cells["SystemId"].Value != null) // Need to check for null if new row is exposed
    {
        if(row.Cells["SystemId"].Value.ToString().Equals(searchValue))
        {
            rowIndex = row.Index;
            break;
        }
    }
}

LINQ の回答:

int rowIndex = -1;

bool tempAllowUserToAddRows = dgv.AllowUserToAddRows;

dgv.AllowUserToAddRows = false; // Turn off or .Value below will throw null exception

    DataGridViewRow row = dgv.Rows
        .Cast<DataGridViewRow>()
        .Where(r => r.Cells["SystemId"].Value.ToString().Equals(searchValue))
        .First();

    rowIndex = row.Index;

dgv.AllowUserToAddRows = tempAllowUserToAddRows;
于 2014-11-20T03:44:37.287 に答える
2

または、このように使用することもできます。これはより速いかもしれません。

int iFindNo = 14;
int j = dataGridView1.Rows.Count-1;
int iRowIndex = -1;
for (int i = 0; i < Convert.ToInt32(dataGridView1.Rows.Count/2) +1; i++)
{
    if (Convert.ToInt32(dataGridView1.Rows[i].Cells[0].Value) == iFindNo)
    {
        iRowIndex = i;
        break;
    }
    if (Convert.ToInt32(dataGridView1.Rows[j].Cells[0].Value) == iFindNo)
    {
        iRowIndex = j;
        break;
    }
    j--;
}
if (iRowIndex != -1)
    MessageBox.Show("Index is " + iRowIndex.ToString());
else
    MessageBox.Show("Index not found." );
于 2014-06-07T04:35:57.053 に答える
2

これを試して:

        string searchValue = textBox3.Text;
        int rowIndex = -1;

        dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
        try
        {
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                if (row.Cells["peseneli"].Value.ToString().Equals(searchValue))
                {
                    rowIndex = row.Index;
                    dataGridView1.CurrentCell = dataGridView1.Rows[rowIndex].Cells[0];
                    dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Selected = true;

                    break;
                }
            }
        }
        catch (Exception exc)
        {
            MessageBox.Show(exc.Message);
        }
于 2014-10-05T11:45:10.030 に答える
1

そのアイテムが存在するかどうかを確認したいだけの場合:

IEnumerable<DataGridViewRow> rows = grdPdfs.Rows
            .Cast<DataGridViewRow>()
            .Where(r => r.Cells["SystemId"].Value.ToString().Equals(searchValue));
if (rows.Count() == 0) 
{
    // Not Found
} 
else 
{
    // Found
}
于 2014-05-20T17:39:03.393 に答える
1

これは、ゴードンからの上記の回答に基づいています。すべてが私のオリジナルの作品ではありません。私がしたことは、より一般的なメソッドを静的ユーティリティ クラスに追加することでした。

public static int MatchingRowIndex(DataGridView dgv, string columnName, string searchValue)
        {
        int rowIndex = -1;
        bool tempAllowUserToAddRows = dgv.AllowUserToAddRows;

        dgv.AllowUserToAddRows = false; // Turn off or .Value below will throw null exception
        if (dgv.Rows.Count > 0 && dgv.Columns.Count > 0 && dgv.Columns[columnName] != null)
            {
            DataGridViewRow row = dgv.Rows
                .Cast<DataGridViewRow>()
                .FirstOrDefault(r => r.Cells[columnName].Value.ToString().Equals(searchValue));

            rowIndex = row.Index;
            }
        dgv.AllowUserToAddRows = tempAllowUserToAddRows;
        return rowIndex;
        }

次に、使用したい形式で、DataGridView、列名、および検索値を渡してメソッドを呼び出します。簡単にするために、検索用にすべてを文字列に変換していますが、データ型を指定するためにオーバーロードを追加するのは簡単です。

private void UndeleteSectionInGrid(string sectionLetter)
        {
        int sectionRowIndex = UtilityMethods.MatchingRowIndex(dgvSections, "SectionLetter", sectionLetter);
        dgvSections.Rows[sectionRowIndex].Cells["DeleteSection"].Value = false;
        }
于 2016-08-08T14:57:00.573 に答える