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

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

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

Re[3]: datagridviewの列を動的に見えなくさせる


(過去ログ 19 を表示中)

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

■7667 / inTopicNo.1)  datagridviewの列を動的に見えなくさせる
  
□投稿者/ めい (1回)-(2007/09/12(Wed) 20:08:15)

分類:[C#] 

よろしくお願いします。

言語はC#、visualstudio2005を利用しています。

datagiridviewの各セルに値を入れ、formのロード時にあらかじめ用意していたランダム配列を
タイマイベントで流し、その配列の中身と合致したセルの行を消去して、上に詰めるような
プログラムを考えています。

例えばセル内に1,2,5,6,9が入っており、配列Aに2,5が配列Bに1,9が入っていたとすると、

DataGridviewの初期表示 →配列Aを読む   →配列Bを読む
1                   1         6
2                   6 
5                   9



と、いうような感じです。removeで削除する、というのは出来たのですが、visible = falseにしても
'現在のマネージャの位置に関連付けられた行を非表示にすることはできません' とエラーが出てしまいます。

上記処理終了後、'表示'ボタンで、合致した値を反転させて表示(上で言う1,2,5,9)する予定なので
removeはできれば使いたくありません。何か他に良い方法はあるでしょうか?
また、反転させて表示する場合、合致した行数を覚えておいて、その該当行に対して処理を行う、以外により
スマートな方法はあるでしょうか?
引用返信 編集キー/
■7682 / inTopicNo.2)  Re[1]: datagridviewの列を動的に見えなくさせる
□投稿者/ 七曜 (15回)-(2007/09/13(Thu) 01:35:30)
ちょっとしたアイデアでしかありませんが、DataGridViewにBindするデータにFilterをかけるのではいかがでしょうか。
こんな感じです。RowFilterはStringなので、生成方法を考えれば希望される動作はしそうですが。


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        private DataSet data = new DataSet();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            DataTable table = data.Tables.Add("data");
            table.Columns.Add("number", System.Type.GetType("System.UInt32"));
            DataRow row;
            row = table.NewRow();  row["number"] = 1;   table.Rows.Add(row);
            row = table.NewRow();  row["number"] = 2;   table.Rows.Add(row);
            row = table.NewRow();  row["number"] = 5;   table.Rows.Add(row);
            row = table.NewRow();  row["number"] = 6;   table.Rows.Add(row);
            row = table.NewRow();  row["number"] = 9;   table.Rows.Add(row);

            dataGridView1.DataSource = table;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            DataTable gridTable = (DataTable)dataGridView1.DataSource;
            gridTable.DefaultView.RowFilter = "number NOT IN (2, 5)";
        }

        private void button2_Click(object sender, EventArgs e)
        {
            DataTable gridTable = (DataTable)dataGridView1.DataSource;
            if (gridTable.DefaultView.RowFilter != "")
            {
                gridTable.DefaultView.RowFilter = "(" + gridTable.DefaultView.RowFilter + ") and (number NOT IN (1, 9))";
            }
            else
            {
                gridTable.DefaultView.RowFilter = "(number NOT IN (1, 9))";
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            DataTable gridTable = (DataTable)dataGridView1.DataSource;
            gridTable.DefaultView.RowFilter = "";
        }
    }
}

引用返信 編集キー/
■7726 / inTopicNo.3)  Re[2]: datagridviewの列を動的に見えなくさせる
□投稿者/ めい (2回)-(2007/09/13(Thu) 18:37:19)
動きのイメージは挙げて頂いたコードの通りです。ありがとうございます。

もう一つの反転処理なのですが、これはCellFormattingを使うのがベターなのでしょうか?
只、Columnの指定は出来るのですが、特定のRowの値を指定する方法が分からなかったので
そこで止まっています。
最終的には、下記のように該当行を削除するような見せ方と、該当行を反転しようと思っています。
(前者はデータを読み込むほど行が減るような感じで、後者は行数は変わらず、該当行の背景色が変わっていく、というようなイメージです)

formのロード時にランダムにデータを読み込むことは出来たのですが、反転処理にとまどっている状態です。
また、下記の中で
gridTable.DefaultView.RowFilter = "";
を代入している部分がありますが、これは復元処理(フィルタリングの要素を指定しない?)なのでしょうか?

No7682 (七曜 さん) に返信
> ちょっとしたアイデアでしかありませんが、DataGridViewにBindするデータにFilterをかけるのではいかがでしょうか。
> こんな感じです。RowFilterはStringなので、生成方法を考えれば希望される動作はしそうですが。
>
>
> using System;
> using System.Collections.Generic;
> using System.ComponentModel;
> using System.Data;
> using System.Drawing;
> using System.Text;
> using System.Windows.Forms;
>
> namespace WindowsApplication1
> {
> public partial class Form1 : Form
> {
> private DataSet data = new DataSet();
>
> public Form1()
> {
> InitializeComponent();
> }
>
> private void Form1_Load(object sender, EventArgs e)
> {
> DataTable table = data.Tables.Add("data");
> table.Columns.Add("number", System.Type.GetType("System.UInt32"));
> DataRow row;
> row = table.NewRow(); row["number"] = 1; table.Rows.Add(row);
> row = table.NewRow(); row["number"] = 2; table.Rows.Add(row);
> row = table.NewRow(); row["number"] = 5; table.Rows.Add(row);
> row = table.NewRow(); row["number"] = 6; table.Rows.Add(row);
> row = table.NewRow(); row["number"] = 9; table.Rows.Add(row);
>
> dataGridView1.DataSource = table;
> }
>
> private void button1_Click(object sender, EventArgs e)
> {
> DataTable gridTable = (DataTable)dataGridView1.DataSource;
> gridTable.DefaultView.RowFilter = "number NOT IN (2, 5)";
> }
>
> private void button2_Click(object sender, EventArgs e)
> {
> DataTable gridTable = (DataTable)dataGridView1.DataSource;
> if (gridTable.DefaultView.RowFilter != "")
> {
> gridTable.DefaultView.RowFilter = "(" + gridTable.DefaultView.RowFilter + ") and (number NOT IN (1, 9))";
> }
> else
> {
> gridTable.DefaultView.RowFilter = "(number NOT IN (1, 9))";
> }
> }
>
> private void button3_Click(object sender, EventArgs e)
> {
> DataTable gridTable = (DataTable)dataGridView1.DataSource;
> gridTable.DefaultView.RowFilter = "";
> }
> }
> }
引用返信 編集キー/
■8000 / inTopicNo.4)  Re[3]: datagridviewの列を動的に見えなくさせる
□投稿者/ 七曜 (23回)-(2007/09/21(Fri) 02:48:23)
> gridTable.DefaultView.RowFilter = "";
> を代入している部分がありますが、これは復元処理(フィルタリングの要素を指定しない?)なのでしょうか?

これはFilterを解除してるだけです。ですのでBindされているテーブルの全行が表示されます。

で、CellFormattingはイベントなのでちょっと違うような気がしますね。
(処理タイミングとして検討しているならかもしれませんけど試したことはないです。)


単純に該当行を反転というか色を変えたいだけなら、こんな感じでできますけど。

private void button4_Click(object sender, EventArgs e)
{
DataTable gridTable = (DataTable)dataGridView1.DataSource;
foreach (DataGridViewRow row in dataGridView1.Rows)
{
DataRowView viewRow = (DataRowView)row.DataBoundItem;
if (viewRow != null)
{
if ((UInt32.Parse(viewRow.Row.ItemArray[0].ToString()) == 1) ||
(UInt32.Parse(viewRow.Row.ItemArray[0].ToString()) == 9))
{
row.DefaultCellStyle.BackColor = Color.Red;
}
}
}
}

反転というのが、標準としてしてしているForeColorとBackColorを入れ替えて指定する感じなのでしょうかね?
それだと、dataGridView1.DefaultCellStyle.ForeColorとかdataGridView1.DefaultCellStyle.BackColorとか取り出せば良いでしょう。

反転させる行の特定方法は色々な方法があるかと思いますので、お考えいただくと良いでしょう。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -