- PR -

DataGridの選択マークの制御について

1
投稿者投稿内容
moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 2005-08-24 17:00
お世話さまです。

VS.NET2003(VB)で開発しています。

DataGridの行選択のコントロールをやっているのですが
選択された行の反転表示のコントロールは
DataGrid.Select(位置変数)
という感じで制御できているのですが、
この恣意的な反転表示と、行のセレクタに表示される
三角マークが一致しないので見た目が悪くて困っています。

恐らくこの三角マークはカレント行の意味で表示されている
と思うのですが、この三角マークを反転表示と同じ行に
恣意的に変更することが可能なのかどうかご教示願います。

もし、制御が不能なのであれば、このセレクタの列を削除(非表示)
したいとも考えています。

併せて、削除(非表示)の方法をご教示頂けると助かります。

以上、宜しくお願い致します。
moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 2005-08-24 17:05
舌の根も乾かぬウチに自己レスです。^^;

CurrentRowIndexプロパティで制御できました。

お騒がせしました。
ずっと初心者
会議室デビュー日: 2008/10/02
投稿数: 9
投稿日時: 2008-10-02 11:12
返信ではないのですが、追っかけ質問です。VB2005のDataGridViewを使っています。
VB2003では「CurrentRowIndex」で解決と書かれていました。VB2003のDataGrid
で試してみていませんが、VB2005のDataGridViewでCurrentRow.IndexとかSelectRows.とか
触ってみましたが、三角マークを消す方法が見つかりません。
教えてください。
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-10-02 14:38
引用:

ずっと初心者さんの書き込み (2008-10-02 11:12) より:
返信ではないのですが、追っかけ質問です。VB2005のDataGridViewを使っています。
VB2003では「CurrentRowIndex」で解決と書かれていました。VB2003のDataGrid
で試してみていませんが、VB2005のDataGridViewでCurrentRow.IndexとかSelectRows.とか
触ってみましたが、三角マークを消す方法が見つかりません。
教えてください。



三角マークを直接どうこうすることはできないので、

・前景色と背景色を同じにしてごまかす
・ヘッダを隠して、一番左のデータ列をヘッダっぽく見せる
・三角マークが隠れるくらいまでヘッダを縮める
・カスタム描画で頑張る
のような方法になります。

以下のスレッドも参照してください。
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=573974&SiteID=7
seai
ベテラン
会議室デビュー日: 2007/04/10
投稿数: 60
投稿日時: 2008-10-02 14:41
こんにちは

引用:

ずっと初心者さんの書き込み (2008-10-02 11:12) より:
返信ではないのですが、追っかけ質問です。VB2005のDataGridViewを使っています。
VB2003では「CurrentRowIndex」で解決と書かれていました。VB2003のDataGrid
で試してみていませんが、VB2005のDataGridViewでCurrentRow.IndexとかSelectRows.とか
触ってみましたが、三角マークを消す方法が見つかりません。
教えてください。





どこで見たか忘れましたが手元に同様の事例がありましたので
参考になれば・・・


コード:
'対象となるDataGridViewのあるフォームのロード
    Private Sub EditValue_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load
        '最初にこの命令を実行すると行ヘッダーの三角を消せる
        DataGridView1.RowTemplate.HeaderCell = New myDataGridViewRowHeaderCell

        DataGridView1.Rows.Add()
        DataGridView1.Rows.Add()
    End Sub


'行ヘッダーの三角マークを消す処理のためにClassを作る
Public Class myDataGridViewRowHeaderCell
    Inherits DataGridViewRowHeaderCell
    '行ヘッダーの三角マークを消す処理
    Protected Overrides Sub Paint(ByVal graphics As Graphics, _
                                ByVal clipBounds As Rectangle, _
                                ByVal cellBounds As Rectangle, _
                                ByVal rowIndex As Integer, _
                                ByVal cellState As DataGridViewElementStates, _
                                ByVal value As Object, _
                                ByVal formattedValue As Object, _
                                ByVal errorText As String, _
                                ByVal cellStyle As DataGridViewCellStyle, _
                                ByVal advancedBorderStyle As DataGridViewAdvancedBorderStyle, _
                                ByVal paintParts As DataGridViewPaintParts)

        MyBase.Paint(graphics, clipBounds, cellBounds, _
                    rowIndex, cellState, value, formattedValue, _
                    errorText, cellStyle, advancedBorderStyle, _
                    paintParts And Not DataGridViewPaintParts.ContentBackground)
    End Sub

End Class



列ヘッダーの場合はこんなのもありますが・・
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=1815100&SiteID=7
ずっと初心者
会議室デビュー日: 2008/10/02
投稿数: 9
投稿日時: 2008-10-02 15:59
seaiさん、rainさん、お返事ありがとうございました。seaiさんに教えてもらった方法で解決しました。やった!って感じです。三角マークために、半日ほど潰しました。もっと早く聞けばよかった。ありがとうございました。
kakel
会議室デビュー日: 2008/11/06
投稿数: 7
投稿日時: 2008-11-06 19:10
返答ではないのですが、便乗しておっかけ質問です。

同様のことをC#でやろうとしていて、できるには一応できたのですが、
一部DataGridViewのプロパティを変えたところ、こけてしまいます。

プロパティはAllowUserToAddRowsでfalseに設定する(一番下に追加行の※印がつく)ととこけてしまいます。

これはrainさんが引用されていたスレッド中の
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=573974&SiteID=7

trapemiyaさんが記述している
「また、新規行の追加を許していると、こけてしまうようですので、それを禁止するか、もしくはDatGridViewでOnRowsAddedをオーバーライドし、その中で、NewRowIndexの場合には、
this.Rows[this.NewRowIndex].HeaderCell = new myDataGridViewRowHeaderCell();
として下さい。」
のことだと思うのですが、実装方法がわかりません。
よろしくお願いします。
kakel
会議室デビュー日: 2008/11/06
投稿数: 7
投稿日時: 2008-11-07 12:34
自己レスです。

悪戦苦闘しながら、こういうことかなと実装してみました。

public class myCustomGrid : DataGridView
{
protected override void OnRowsAdded(DataGridViewRowsAddedEventArgs e)
{
if (e.RowIndex == NewRowIndex)
{
this.Rows[this.NewRowIndex].HeaderCell =
new myDataGridViewRowHeaderCell();
}
}
}

しかし、やはりこけてしまいます。わからないなりに色々調べているうちに
勘違いしているような気がしてきました。

AllowUserToRowsはtrueで最終行の*印が表示され、ユーザが行を追加できる。
また、falseで*印の行の表示がなくなり、ユーザが行を追加できないようにする。

ということは・・・
falseで追加権限を与えていないから、プログラム内で行を追加しようとして
こけているのでは?

と思い、最初の設定でプロパティを変更するのではなく、行追加した後でfalseに変更。
予想通りうまく動作しました。(OnRowsAddedのoverrideは不要)

結局のところ、禁止するなら、Trueにしといて、後からfalseすればよかっただけ
、許可するなら、overrideがいるということだったのですね。

自己解決できたと思います。お騒がせしました。但し、
「勘違いしてるよ〜」等ありましたら、ご指摘下さい。
よろしくお願いします。
1

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