C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: datagridviewのセルイベントについて


(過去ログ 18 を表示中)

[トピック内 13 記事 (1 - 13 表示)]  << 0 >>

■7313 / inTopicNo.1)  datagridviewのセルイベントについて
  
□投稿者/ グリッド (1回)-(2007/09/03(Mon) 19:23:27)

分類:[.NET 全般] 

よろしくお願いします。

visualstudio2005でdatagridviewを使っています。

grid内にボタンを行数分用意し、ボタンを押すとそのボタンのある行全体の色が変わる
プログラムを行っています。ですが、そのボタン以外のセルを選択すると、
選択時のデフォルトの青い色が出てしまうため、これを出ないように2通りの
方法を考えました。

1つ目は、セル選択時のselectionbackcolorを透明色での解決法です。
この場合、色の指定で、透明色を選択することは可能でしょうか?
プロパティのDefaultCellstyleからは分からなかったので・・・
(選択時と通常時のbackcolor,forecolorを同一にしても、そのセルのフォーカスを
変えない限り色が変わらなかった)

2つ目は、特定の列(この場合ボタン列以外)のフォーカスを無くし、セルを
選択できなくする方法です。こちらも、全体のフォーカス禁止は出来るのですが、
列単位での指定は分かりませんでした。

上記2つの考え方、又は他の解決法がありましたらよろしくお願いします。
引用返信 編集キー/
■7354 / inTopicNo.2)  Re[1]: datagridviewのセルイベントについて
□投稿者/ グリッド (2回)-(2007/09/04(Tue) 14:00:22)
色々調べてみて、解決はしていないのですが、状況を書かせてください。
下記1のパターンは、どうやら透明色というのが存在しないそうです。
2のパターンも、調べてみましたが指定列のフォーカスを禁止するのは無理みたいです。

 DataGridView dgv = (DataGridView)sender;

  if (dgv.Columns[e.ColumnIndex].Name == "Button" && (String)array[e.RowIndex] != "false")
                {

                    dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Yellow;
array[e.RowIndex] = "false";
else if ((String)array[e.RowIndex] != "false")
                {
dataGridView1[e.ColumnIndex,e.RowIndex].DefaultCellStyle.BackColor = Color.White;
}
 else
                {
                    dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Yellow;
                }
            }
こんな感じで、ボタンが押されたらその行を黄色にして、フラグをfalseに。
フラグがfalseでなく、ボタン列で無いセルにフォーカスを当てた場合は白に、
それ以外(ボタンが押された行でかつボタン列でないセルにフォーカスを当てた場合)は黄色
にするように書いたのですが、プロパティのselectionbackcolorの方が強いらしく、(効果の強さは セル>列でしょうから)
設定したDefaultCellStyle.BackColor が効いてくれませんでした。

恐れ入りますが解決法がありましたらよろしくお願いします。



■No7313 (グリッド さん) に返信
> よろしくお願いします。
> 
> visualstudio2005でdatagridviewを使っています。
> 
> grid内にボタンを行数分用意し、ボタンを押すとそのボタンのある行全体の色が変わる
> プログラムを行っています。ですが、そのボタン以外のセルを選択すると、
> 選択時のデフォルトの青い色が出てしまうため、これを出ないように2通りの
> 方法を考えました。
> 
> 1つ目は、セル選択時のselectionbackcolorを透明色での解決法です。
> この場合、色の指定で、透明色を選択することは可能でしょうか?
> プロパティのDefaultCellstyleからは分からなかったので・・・
> (選択時と通常時のbackcolor,forecolorを同一にしても、そのセルのフォーカスを
> 変えない限り色が変わらなかった)
> 
> 2つ目は、特定の列(この場合ボタン列以外)のフォーカスを無くし、セルを
> 選択できなくする方法です。こちらも、全体のフォーカス禁止は出来るのですが、
> 列単位での指定は分かりませんでした。
> 
> 上記2つの考え方、又は他の解決法がありましたらよろしくお願いします。

引用返信 編集キー/
■7359 / inTopicNo.3)  Re[2]: datagridviewのセルイベントについて
□投稿者/ Hongliang (186回)-(2007/09/04(Tue) 16:10:43)
Hongliang さんの Web サイト
SelectionBackColor を BackColor と同じにすりゃいいんじゃないですか?
引用返信 編集キー/
■7365 / inTopicNo.4)  Re[3]: datagridviewのセルイベントについて
□投稿者/ グリッド (3回)-(2007/09/04(Tue) 16:15:00)
1つ目に書いたとおり、buttonクリック時の色の変更より優先度が強い?ため、
フォーカスを変えない限り見た目が変わらないこととなってしまいます。

No7359 (Hongliang さん) に返信
> SelectionBackColor を BackColor と同じにすりゃいいんじゃないですか?
引用返信 編集キー/
■7367 / inTopicNo.5)  Re[4]: datagridviewのセルイベントについて
□投稿者/ Hongliang (187回)-(2007/09/04(Tue) 16:47:00)
Hongliang さんの Web サイト
2007/09/04(Tue) 16:52:41 編集(投稿者)

んん? 状況がつかめませんね。
まず、ボタンを押したとき押していないときで、選択しているセルとしていないセル、ボタンとそれ以外のセルをそれぞれどういう色にしたいのか整理していただけませんか?
引用返信 編集キー/
■7370 / inTopicNo.6)  Re[5]: datagridviewのセルイベントについて
□投稿者/ グリッド (4回)-(2007/09/04(Tue) 17:29:05)
確かにそうですね。もう1度詳しく書かせていただきます。

2行2列のdatagridviewで、2列目にボタンを置きます。
デフォルトの状態はbackcolorが白色になっています。
ボタンを押すとそれぞれボタンの配置されている行のbackcolorが黄色になります。
黄色になるタイミングはボタン押下時のイベントです。

ボタン押下前の1列目のセルは押しても白色のままですが、
ボタン押下後は該当行のセルを押すと黄色に見えます

つまり、ボタンを押した瞬間に対象行の色を黄色に出来るようにしたいのです。

そこで、現状試した案がいくつかありまして、

1.selectionbackcolorとbackcolorを同一(白色)にする
→ボタン押下行のフォーカスを外さない限り白色のまま、さらに
該当行のセルを押すと白色に見えてしまう
2.selectionbackcolorをボタン押下時の色(黄色)にする
→ボタンを押していなくても1列目を押すと色が黄色に見える
3.1列目にフォーカスを当てられないようにする
→指定列にフォーカスを当てないようにするのは無理

1は押した時点で対象行が黄色になってくれればOKです。
又は、selectioncolorを透明色にするという案もありましたが、
どうやらないようです。


No7367 (Hongliang さん) に返信
> 2007/09/04(Tue) 16:52:41 編集(投稿者)
>
> んん? 状況がつかめませんね。
> まず、ボタンを押したとき押していないときで、選択しているセルとしていないセル、ボタンとそれ以外のセルをそれぞれどういう色にしたいのか整理していただけませんか?
引用返信 編集キー/
■7372 / inTopicNo.7)  Re[6]: datagridviewのセルイベントについて
□投稿者/ Hongliang (188回)-(2007/09/04(Tue) 17:49:00)
Hongliang さんの Web サイト
> デフォルトの状態はbackcolorが白色になっています。

> ボタン押下前の1列目のセルは押しても白色のままですが、

つまり、行の既定の SelectionBackColor も BackColor 同様に White なんですよね。

> ボタンを押すとそれぞれボタンの配置されている行のbackcolorが黄色になります。
> 黄色になるタイミングはボタン押下時のイベントです。

> ボタン押下後は該当行のセルを押すと黄色に見えます

で、押下時に行の既定の SelectionBackColor も BackColor 同様に Yellow になるんですよね。

同じ行の各セルが異なる色を示すのでない限り、これだけで事足りるはずですが。
引用返信 編集キー/
■7374 / inTopicNo.8)  Re[6]: datagridviewのセルイベントについて
□投稿者/ 魔界の仮面弁士 (402回)-(2007/09/04(Tue) 18:01:01)
2007/09/04(Tue) 18:15:48 編集(投稿者)
> 分類:[.NET 全般]
言語は制限しないということでしょうか?
No7354 が C# なので、それに合わせて回答しておきます。


■No7370 (グリッド さん) に返信
> つまり、ボタンを押した瞬間に対象行の色を黄色に出来るようにしたいのです。

えぇと…。
グリッド さんの「やりたいこと」は分かったのですが、「何に困っているのか」がわかりません。


とりあえず、仕様どおりに作ってみたつもりですが、問題点はどこでしょうか。

private void Form1_Load(object sender, EventArgs e)
{
    // 2行2列のdatagridviewで、2列目にボタンを置きます。
    dataGridView1.AllowUserToAddRows = false;
    dataGridView1.Columns.Clear();
    dataGridView1.Columns.AddRange(
        new DataGridViewTextBoxColumn(),
        new DataGridViewButtonColumn());
    dataGridView1.RowCount = 2;

    //デフォルトの状態はbackcolorが白色になっています。
    DataGridViewCellStyle style = dataGridView1.DefaultCellStyle;
    style.BackColor = style.SelectionBackColor = Color.White;
}

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex != 1) return;

    // ボタンを押すとそれぞれボタンの配置されている行のbackcolorが黄色になります。
    // 黄色になるタイミングはボタン押下時のイベントです。
    DataGridViewCellStyle style = ((DataGridView)sender).Rows[e.RowIndex].DefaultCellStyle;
    style.BackColor = style.SelectionBackColor = Color.Yellow;
}

引用返信 編集キー/
■7377 / inTopicNo.9)  Re[7]: datagridviewのセルイベントについて
□投稿者/ グリッド (5回)-(2007/09/04(Tue) 22:11:44)
修正を加えて、実装することが出来ました。ありがとうございます。
そこで、もう一つ質問なのですが、別途クリアボタンを用意して、ボタンを押すと
初期表示になるようなイベントを作りたいのですが、下記のようなコードでは、
最後にボタンを押した行がフォーカスを外さない限り黄色になったままなのと、
クリアする前に押したボタンの該当セルを押すと黄色になってしまいます。
これらを解決する手段はあるのでしょうか?

for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.White;
dataGridView1.DefaultCellStyle.SelectionBackColor = Color.White;
} }


No7374 (魔界の仮面弁士 さん) に返信
> 2007/09/04(Tue) 18:15:48 編集(投稿者)
>
> > 分類:[.NET 全般]
> 言語は制限しないということでしょうか?
> No7354 が C# なので、それに合わせて回答しておきます。
>
>
> ■No7370 (グリッド さん) に返信
>>つまり、ボタンを押した瞬間に対象行の色を黄色に出来るようにしたいのです。
>
> えぇと…。
> グリッド さんの「やりたいこと」は分かったのですが、「何に困っているのか」がわかりません。
>
>
> とりあえず、仕様どおりに作ってみたつもりですが、問題点はどこでしょうか。
>
> private void Form1_Load(object sender, EventArgs e)
> {
> // 2行2列のdatagridviewで、2列目にボタンを置きます。
> dataGridView1.AllowUserToAddRows = false;
> dataGridView1.Columns.Clear();
> dataGridView1.Columns.AddRange(
> new DataGridViewTextBoxColumn(),
> new DataGridViewButtonColumn());
> dataGridView1.RowCount = 2;
>
> //デフォルトの状態はbackcolorが白色になっています。
> DataGridViewCellStyle style = dataGridView1.DefaultCellStyle;
> style.BackColor = style.SelectionBackColor = Color.White;
> }
>
> private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
> {
> if (e.ColumnIndex != 1) return;
>
> // ボタンを押すとそれぞれボタンの配置されている行のbackcolorが黄色になります。
> // 黄色になるタイミングはボタン押下時のイベントです。
> DataGridViewCellStyle style = ((DataGridView)sender).Rows[e.RowIndex].DefaultCellStyle;
> style.BackColor = style.SelectionBackColor = Color.Yellow;
> }
引用返信 編集キー/
■7383 / inTopicNo.10)  Re[8]: datagridviewのセルイベントについて
□投稿者/ 魔界の仮面弁士 (403回)-(2007/09/05(Wed) 00:54:01)
No7377 (グリッド さん) に返信
> 修正を加えて、実装することが出来ました。ありがとうございます。
実装できたことは分かったのですが、何に困っていたのかがわかりません。(;_;)


> 初期表示になるようなイベントを作りたいのですが、下記のようなコードでは、
イベントを作る…?
DataGridView を継承したコントロールを作成して、そこにイベントを作りこむような状況でしょうか。

独自のイベントを実装する方法に関しては、下記を参照してみてください。
http://msdn2.microsoft.com/ja-jp/library/5z57dxz2%28VS.80%29.aspx


> そこで、もう一つ質問なのですが、別途クリアボタンを用意して、ボタンを押すと
このボタンとは、DataGridView 上の DataGridViewButtonCell のことではなく、
System.Windows.Forms.Button の事で良いでしょうか?


> 最後にボタンを押した行がフォーカスを外さない限り黄色になったままなのと、
> クリアする前に押したボタンの該当セルを押すと黄色になってしまいます。
> これらを解決する手段はあるのでしょうか?
状況が今ひとつ理解できていないのですが……とりあえず、先に提示した
No7374 のサンプルに以下のコードを追加してみました。これで如何でしょう。

private void button1_Click(object sender, EventArgs e)
{
    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        row.DefaultCellStyle = null;
    }
}

引用返信 編集キー/
■7393 / inTopicNo.11)  Re[9]: datagridviewのセルイベントについて
□投稿者/ グリッド (6回)-(2007/09/05(Wed) 09:56:22)
何度もありがとうございます。

No7383 (魔界の仮面弁士 さん) に返信
> ■No7377 (グリッド さん) に返信
>>修正を加えて、実装することが出来ました。ありがとうございます。
> 実装できたことは分かったのですが、何に困っていたのかがわかりません。(;_;)

上記でも書いていたのですが、自分で作成した段階では、例えば魔界の仮面弁士 さんの挙げていただいたサンプルコードの例の
フォームの見た目だけ想像していただいてもらうと、selectionbackColorを通常のbackcolorと同一にしてしまうと、ボタンクリック時に
backcolorを黄色に指定してもフォーカスを離さない限り色が変わらず、又、ボタンが押された行のセルをクリックするとselectioncolorが
有効となっているのか白色になってしまう、というものでした。おそらく、↓のようなコード(考え方)が足りていなかったからだと
思っています。

DataGridViewCellStyle style = ((DataGridView)sender).Rows[e.RowIndex].DefaultCellStyle;


>>初期表示になるようなイベントを作りたいのですが、下記のようなコードでは、
> イベントを作る…?
> DataGridView を継承したコントロールを作成して、そこにイベントを作りこむような状況でしょうか。
>
> 独自のイベントを実装する方法に関しては、下記を参照してみてください。
> http://msdn2.microsoft.com/ja-jp/library/5z57dxz2%28VS.80%29.aspx
>
>
>>そこで、もう一つ質問なのですが、別途クリアボタンを用意して、ボタンを押すと
> このボタンとは、DataGridView 上の DataGridViewButtonCell のことではなく、
> System.Windows.Forms.Button の事で良いでしょうか?

すみません、言葉足らずでした。System.Windows.Forms.Button の方ですね。


>>最後にボタンを押した行がフォーカスを外さない限り黄色になったままなのと、
>>クリアする前に押したボタンの該当セルを押すと黄色になってしまいます。
>>これらを解決する手段はあるのでしょうか?
> 状況が今ひとつ理解できていないのですが……とりあえず、先に提示した
> No7374 のサンプルに以下のコードを追加してみました。これで如何でしょう。
>
> private void button1_Click(object sender, EventArgs e)
> {
> foreach (DataGridViewRow row in dataGridView1.Rows)
> {
> row.DefaultCellStyle = null;
> }
> }

はい、こちらで解決いたしました。只、自分で書いた↓でダメだった理由がまだよく分かっていません。
↑でやっていることは、”セルを押した”という履歴自体を消している、というような感覚なのですが
見当違いなのでしょうか?

dataGridView1.DefaultCellStyle.SelectionBackColor = Color.White;

for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.White;

引用返信 編集キー/
■7404 / inTopicNo.12)  DataGridViewでのセルのスタイルについて
□投稿者/ 魔界の仮面弁士 (404回)-(2007/09/05(Wed) 12:48:32)
2007/09/05(Wed) 14:11:23 編集(投稿者)
大文字小文字の使い分けは適切に。(C# を使っているのですし)

■No7393 (グリッド さん) に返信
> フォームの見た目だけ想像していただいてもらうと、selectionbackColorを通常のbackcolorと同一にしてしまうと、
具体的に、「何」の SelectionBackColor を操作しているのかを把握しておきましょう。
セルの書式を設定する箇所は、複数ありますので。

http://rsdn.ru/article/dotnet/DataGridView20part2%5Ccellstyles.png
http://msdn2.microsoft.com/ja-jp/library/1yef90x0.Local_501028840_datagridviewcells1%28ja-jp%2cVS.80%29.gif
http://msdn2.microsoft.com/ja-jp/library/1yef90x0%28VS.80%29.aspx


> はい、こちらで解決いたしました。只、自分で書いた↓でダメだった理由がまだよく分かっていません。
> dataGridView1.DefaultCellStyle.SelectionBackColor = Color.White;
> for (int i = 0; i < dataGridView1.Rows.Count; i++)
> {
>     dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.White;
> }

No7374 では、「行の既定のスタイル」に対して黄色を割り当てたわけですが、提示された
No7393 のコードに含まれている処理では、戻すべき処理対象が微妙に異なっているためです。

---------
> dataGridView1.DefaultCellStyle.SelectionBackColor = Color.White;
1. 「DataGridView 全体の既定のスタイル」で、SelectionBackColor を白に変更。

> for (int i = 0; i < dataGridView1.Rows.Count; i++)
> {
>     dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.White;
> }
2. 全行ループして、「行の既定のスタイル」で、BackColor を白に変更。
---------

すなわち、「行の既定のスタイル」の SelectionBackColor がリセットされていないのです。
(さらに言えば、White を代入するのも不適切で、元に戻すなら Empty を入れるべきかと)

リセットすべき対象が間違っていたため、最終的にセルに受け継がれた設定を確認しても、
 Color a = dataGridView1.CurrentCell.InheritedStyle.SelectionBackColor;
 Color b = dataGridView1.CurrentCell.InheritedStyle.BackColor;
は、後者は白になるものの、前者は黄色のままになってしまうというわけです。


少し長くなりますが、その時点での、カレントセルの SelectionBackColor の設定内容を追ってみましょう。

 1. カレントセルの「セルのスタイル」は未設定なので、「行の規定のスタイル」設定が引き継がれる。
  (dataGridView1.CurrentCell.HasStyle == false)

 2. 「行の既定のスタイル」が存在するので、それの SelectionBackColor 設定が利用される。
  (dataGridView1.CurrentCell.OwningRow.HasDefaultCellStyle == true)

  2.1 行の SelectionBackColor が黄色に設定されていたので、これが選択背景色となる。
    (dataGridView1.CurrentCell.OwningRow.DefaultCellStyle.SelectionBackColor == Color.Yellow)

ということで、「黄色」のまま残ってしまっていたわけです。



No7383 で提示した私のコードの場合はというと、こちらは「行の既定のスタイル」を
null にしているので、上記の 2. 以降が変化します。

 2'. 「行の既定のスタイル」は未設定なので、
  rowIndex == 1 なら「奇数行の既定のスタイル」設定が引き継がれ、
  rowIndex == 0 なら、「全行の既定のスタイル」設定が引き継がれる。
  (dataGridView1.CurrentCell.OwningRow.HasDefaultCellStyle == false)

 3. 「奇数行の既定のスタイル」の SelectionBackColor も未設定なので、
  「行の既定のスタイル」設定が引き継がれる。
  (dataGridView1.AlternatingRowsDefaultCellStyle.SelectionBackColor == Color.Empty)

 4. 「全行の既定のスタイル」の SelectionBackColor も未設定なので、
  「列の既定のスタイル」設定が引き継がれる。
  (dataGridView1.RowsDefaultCellStyle.SelectionBackColor == Color.Empty)

 5. 「列の規定のスタイル」が存在するので、それの SelectionBackColor 設定が利用される。
  (dataGridView1.CurrentCell.OwningColumn.HasDefaultCellStyle == true)

  5.1 列の SelectionBackColor は未設定なので、「DataGridView 全体の既定のスタイル」の
   設定が引き継がれる。
   (dataGridView1.CurrentCell.OwningColumn.DefaultCellStyle.BackColor == Color.Empty)

 6. DataGridView 全体の SelectionBackColor が白に設定されていたので、これが選択背景色となる。
  (dataGridView1.DefaultCellStyle.SelectionBackColor == Color.White)

ということで、こちらは「白」になります。

引用返信 編集キー/
■7443 / inTopicNo.13)  Re[7]: datagridviewのセルイベントについて
□投稿者/ グリッド (7回)-(2007/09/05(Wed) 18:04:01)
返事が遅れて申し訳ありません。

質問への回答だけでなく、詳しく内容の意味を説明していただいて、
感謝の言葉もありません。

セルの書式設定への認識不足が今回の要因だったので、魔界の仮面弁士さんに
挙げていただいたリンク先をしっかり勉強したいと思います。

本当にありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -