-1

ユーザーが DataGridViewTextBox にテキストを入力しているときに、入力した値に応じてコントロールを有効または無効にしたい場合があります。たとえば、正しい値を入力した後にボタンを有効にします

Microsoft は、無効にできる DataGridViewButtonCell の作成方法に関する記事で方法を示しました。

これが彼らのトリックです(他のソリューションでも見られます)

  • イベント DataGridView.CurrentCellDirtyStateChanged を取得していることを確認してください
  • このイベントを受信したら、DataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit); を呼び出して、現在のセルの変更をコミットします。
  • このコミットは、イベント DataGridView.CellValueChanged につながります
  • このイベントが発生したときに通知を受け取るようにしてください
  • OnCellValueChanged 関数で、変更された値の有効性を確認し、対応するコントロール (ボタンなど) を有効にするか無効にするかを決定します。

OnCellValueChanged で CommitEdit がテキストを選択することを除いて、これは正常に機能します。したがって、64 を入力したい場合は、6 を入力したときに通知され、4 を入力したときに通知されます。ただし、6 が選択されているため、64 は取得されませんが、6 は 4 に置き換えられます。何らかの方法で、コードで 6 の選択を解除する必要があります。値を解釈する前に OnCellValueChanged で。

プロパティ DataGridView.Selected はそのトリックを実行せず、テキストの選択を解除しませんが、セルの選択を解除します。

では、選択したセルのテキストを選択解除するにはどうすればよいですか?

4

1 に答える 1

1

ユーザーが現在のセルにテキストを入力しているときに、ボタンを無効にする必要があるかどうかを確認するために、現在のテキストを(コミットする前であっても)知る必要があると思います。したがって、次のアプローチがうまくいくはずです。何もコミットする必要はありませんTextChanged。現在の編集コントロールのイベントを処理するだけです。編集コントロールはEditingControlShowingイベント ハンドラーでのみ公開されます。コードは次のとおりです。

//The EditingControlShowing event handler for your dataGridView1
private void dataGridView1_EditingControlShowing(object sender, 
                                          DataGridViewEditingControlShowingEventArgs e){
   var control = e.Control as TextBox;
   if(control != null && 
      dataGridView1.CurrentCell.OwningColumn.Name == "Interested Column Name"){
      control.TextChanged -= textChanged_Handler;
      control.TextChanged += textChanged_Handler;
   }
}
private void textChanged_Handler(object sender, EventArsg e){
  var control = sender as Control;
  if(control.Text == "interested value") {
     //disable your button here
     someButton.Enabled = false;
     //do other stuff...
  } else {
     someButton.Enabled = true;
     //do other stuff...
  }
}

上記で使用した条件は、必要に応じて変更できることに注意してください。それはあなた次第です。

于 2013-12-17T11:44:35.697 に答える