- PR -

DataGrid で クリックされたセルの行を選択状態にしたい

1
投稿者投稿内容
GO-TEN
常連さん
会議室デビュー日: 2003/12/07
投稿数: 20
投稿日時: 2004-04-02 15:38
C# VS.NET2003 で Windowsフォームを作成しています。

DataGrid で 、RowHeader をクリックした場合、行が選択された状態となり
行全体が反転します(SelectionBackColorプロパティで設定した背景色となる)が、
同様に Cell をクリックした場合も同じように行全体を反転表示させようと思っています。
データグリッドで選択されたデータを、次画面で表示させようと思っているので、
ユーザーにどの行が選択されているのか強調したいためです。

DataGrid の MouseDownイベントでクリックされたセルを取得し、
Selectメソッドで期待した状態になると思ったのですが、
反転表示になりません。
セルにフォーカスがある状態ではだめなのかと、
フォーカスを別のコントロールに移動しましたがだめでした。
Refreshをしてみましたが、一瞬選択されたように見える?ちらつきがありましたが、
やはり反転表示になりません。
クリックしたセルの行をどうすれば反転表示させることができるか
お力を貸してください。

-----------------------------------------------------------
private void dataGrid1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
DataGrid grid = (DataGrid) sender;
//クリックされた座標位置を取得する
System.Windows.Forms.DataGrid.HitTestInfo hti;
hti = this.dataGrid1.HitTest(e.X, e.Y);
//クリックされた場所の情報を取得
switch (hti.Type)
{
// セルだったらセレクト
case System.Windows.Forms.DataGrid.HitTestType.Cell:
this.dataGrid1.Select(hti.Row);
break;
}
}
カウンター
大ベテラン
会議室デビュー日: 2004/02/19
投稿数: 123
投稿日時: 2004-04-02 15:42
こんにちは。C#ではなくてVBでのASP.NETなんですが、以下のようにして、
セルクリックによる反転を行っています。

Private Sub dgMatch_ItemDataBound(sender As Object, e As DataGridItemEventArgs)
'--任意の位置をクリックして選択・編集処理を行う。
Dim ItemType As ListItemType = e.Item.ItemType

If ((itemType = ListItemType.Pager) Or (itemType = ListItemType.Header) Or (itemType = ListItemType.Footer)) Then
Return
Else
'編集処理
Dim btnEdit As LinkButton = CType(e.Item.Cells(1).Controls(0), LinkButton)
e.Item.Attributes("onclick") = Page.GetPostBackClientHyperLink(btnEdit, "")
'選択・ハイライト処理
'Dim btnSelect As LinkButton = CType(e.Item.Cells(0).Controls(0), LinkButton)
'e.Item.Attributes("onclick") = Page.GetPostBackClientHyperLink(btnSelect, "")
End If

End Sub

参考になればよいのですが。
カウンター
大ベテラン
会議室デビュー日: 2004/02/19
投稿数: 123
投稿日時: 2004-04-02 15:46
あえて、言うほどのことではないんですが、
「選択・ハイライト処理」がコメントになってましたね。

すいません^^/~

masas
常連さん
会議室デビュー日: 2002/05/23
投稿数: 25
投稿日時: 2004-04-02 16:13
GO-TENさんはWindowsフォームの質問をしていて、カウンターさんはASP.NETで違うような。。。
Windowsフォームでやる場合は、
private void dataGrid1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
dataGrid1.Select(dataGrid1.CurrentCell.RowNumber);
}
としればOKです。
PAINTを処理するのがちょっと嫌ですが、これ以外の方法がわからんかったです。
カウンター
大ベテラン
会議室デビュー日: 2004/02/19
投稿数: 123
投稿日時: 2004-04-02 16:39
引用:

masasさんの書き込み (2004-04-02 16:13) より:
GO-TENさんはWindowsフォームの質問をしていて、カウンターさんはASP.NETで違うような。。。



そうですね。参考になればと思ったのですが、余計に混乱してしまったかも知れないですね。
GO-TEN
常連さん
会議室デビュー日: 2003/12/07
投稿数: 20
投稿日時: 2004-04-02 22:16
masasさん、ありがとうございました。
以下のように、Paintのイベントを処理することで解決しました。


// フォームのコンストラクタ InitializeComponent 呼び出しの後に追加
this.dataGrid1.Paint +=new PaintEventHandler(dataGrid1_Paint);
<中略>
private void dataGrid1_Paint
(object sender, System.Windows.Forms.PaintEventArgs e)
{
   // カレント行が存在する場合
   if (dataGrid1.CurrentRowIndex > -1)
     dataGrid1.Select(dataGrid1.CurrentCell.RowNumber);
}



カウンターさん、ご意見ありがとうございました。
ASP.NETを使う際は参考にさせていただきます。
GO-TEN
常連さん
会議室デビュー日: 2003/12/07
投稿数: 20
投稿日時: 2004-04-05 22:16
Paint その後:

ごてんです。

Paint で 処理をしたところ、
編集しないデータグリッドでは問題ないのですが
編集可能なデータグリッドでは、文字を入力したくても、
1文字しかセルに入力できない状態になってしまいます。
そこで、CurrentCellChanged イベントで処理するように変更し、
編集可能なデータグリッドでも動作するようになりました。

もっとよい方法がありましたら、ご教授ください。

// データグリッドにデータを表示するボタン
// 初期表示として1行目を選択状態にする
private void btnSearch_Click(object sender, System.EventArgs e)
{
  //・・・データセット部は省略・・・

  if (this.dataGrid1.BindingContext
     [this.dataGrid1.DataSource,this.dataGrid1.DataMember].Count > 0);
   this.dataGrid1.Select(0);
}

private void dataGrid1_CurrentCellChanged(object sender, System.EventArgs e)
{
   // カレント行が存在する場合
   if (dataGrid1.CurrentRowIndex > -1)
     dataGrid1.Select(dataGrid1.CurrentCell.RowNumber);
}
1

スキルアップ/キャリアアップ(JOB@IT)