3

ファイルのリストを入力する dataGridView があります。エントリを選択して (クリックして)、削除キーを押すことで、これらのエントリの一部を削除できるようにしたいと考えています。これまでのコードは次のとおりです。

private void DataGrid_KeyDown(object sender, KeyEventArgs e)
{
     if (e.KeyCode == Keys.Delete)
     {
           foreach (DataGridViewRow r in DataGrid.SelectedRows)
           {
                if (!r.IsNewRow)
                {
                    DataGrid.Rows.RemoveAt(r.Index);                        
                }
           }
     }
}

問題は、選択された行が一度にクリックされたすべての行として定義されることです。ハイライトされたすべての行を削除したいと思います。つまり、行が強調表示されていない場合、その行は選択されていません。

4

6 に答える 6

6

これはうまくいくはずです

 private void DataGrid_KeyDown(object sender, KeyEventArgs e)
 {
   if (e.KeyCode == Keys.Delete)
   {
    Int32 selectedRowCount =  DataGrid.Rows.GetRowCount(DataGridViewElementStates.Selected);
    if (selectedRowCount > 0)
     {
        for (int i = 0; i < selectedRowCount; i++)
        {
            DataGrid.Rows.RemoveAt(DataGrid.SelectedRows[0].Index);  
        }
     }
   }
}
于 2012-11-14T02:21:30.153 に答える
1

直接コメントすることはできないので (評判ポイント)、John Saunders は、特定されたソリューションが機能するはずなのに、元の投稿が機能しない理由について質問しました。
この 2 つの違いは、オリジナルでは For Each ステートメントを使用して反復処理を行っているため、反復処理されたオブジェクトへのオブジェクト参照を強制するため、1 つを削除すると、参照先オブジェクトがめちゃくちゃになる (コレクションであるため、つまりコレクションを変更する) ことです。参照しました)。2 番目の名前付きソリューションは for (int i = 0; i < selected を使用します。これは単にメールボックス [i] 内の個々の場所 (必要に応じて) の文字を取得しているため、コレクションではなく、処理される唯一のオブジェクトです。全体として。
For Eaching の実行中にコレクションを変更することはできません。参照は既に作成されているため、「ロック」されています。

于 2015-03-19T15:47:43.930 に答える
0

    private: System::Void DeleteRow_Click(System::Object^ sender, System::EventArgs^ e)
{           
             /*Int32 rowToDelete = this->dataGridView1->Rows->GetFirstRow(DataGridViewElementStates::Selected);
             do {
                 try{
                     if (this->dataGridView1->Rows[rowToDelete]->IsNewRow){
                         this->dataGridView1->Rows[rowToDelete]->Selected = false;
                         rowToDelete = this->dataGridView1->Rows->GetFirstRow(DataGridViewElementStates::Selected);
                     }

                     this->dataGridView1->Rows->RemoveAt(rowToDelete);

                 }
                 catch (Exception^ e){

                 }
             } while ((rowToDelete = this->dataGridView1->Rows->GetNextRow(rowToDelete, DataGridViewElementStates::Selected)) != -1);
             */

            Int32 selectedRowCount = this->dataGridView1->Rows->GetRowCount(DataGridViewElementStates::Selected);
            for (int i = 0; i dataGridView1->Rows[this->dataGridView1->SelectedRows[0]->Index]->IsNewRow){
                    this->dataGridView1->Rows[this->dataGridView1->SelectedRows[0]->Index]->Selected = false;
                    selectedRowCount = this->dataGridView1->Rows->GetRowCount(DataGridViewElementStates::Selected);
                    i = -1;
                } 
                else {
                    this->dataGridView1->Rows->RemoveAt(this->dataGridView1->SelectedRows[0]->Index);
                }
             }

             this->dataGridView1->ClearSelection();
}


于 2015-07-16T01:54:30.187 に答える
0

次のように逆の for ループを使用するだけです。

    private void ButtonRemoveRows_Click(object sender, EventArgs e)
    {
        DataGridViewRow row;
        int length;

        length = _dataGridView.SelectedRows.Count;
        for(int i = length - 1; i >= 0; i--)
        {
            row = _dataGridView.SelectedRows[i];
            _dataGridView.Rows.Remove(row);
        }
    }

この例は、キーを押すのではなくボタンによってトリガーされますが、変更は簡単です。コードは、余分な変数行と長さを削除して圧縮できます。

于 2020-01-05T20:06:03.890 に答える