none
DataGridViewに表示されているデータをComboBoxのリストで抽出して表示したときの不具合を解消したい RRS feed

  • 質問

  • 下のようにしているとき,

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
     dvKaihi.RowFilter = string.Format("氏名='{0}'", comboBox1.SelectedItem.ToString());
     DataGridView1.DataSource = dvKaihi;
    }

    ドロップダウンリストの一部がDataGridViewに重なって表示されるため,その部分のデータが読めません。

    どのようなことが必要でしょうか。お教え願います。

     

     

    2010年9月7日 1:20

回答

  • 普通は発生しない現象だと考えています。状況をもう一度教えてもらえますか?

    ●確認1
    「左上隅のセルに,”月”をあらわす数字が表示されるべきなのに」とのことですが、
    dataGridView1.TopLeftHeaderCell.Value = "9";
    のように設定されているのでしょうか?
    それとも、コードで月を描画されているのでしょうか?
    もしくは RowHeadersVisible も ColumnHeadersVisible も false だったりして、左上隅は通常のセルなのでしょうか?

    ●確認2
    現象ですが、コンボボックスのドロップダウンリストの表示内容が、グリッドのセルに「残像」として残るということでしょうか?
    最初のご質問の際は「ドロップダウンリストの一部がDataGridViewに重なって表示される」で、今度は「セルに表示されていたデータと重なってしまう」とのことですが、どちらも同じ「重なる」状態のため、違いがわかりませんでした。
    どのような状況か、もう少しご説明いただけないでしょうか?

    ●確認3
    先の私の返信に書かせていただいたコードは、Koyan さんの状況を表現できていますでしょうか?
    (念のため、返信を修正して TopLeftHeaderCell の行を追加しました。)
    その私のコードでも、Koyan さんの環境では問題の現象が発生するのでしょうか?
    可能性として、Koyan さんのコードのどこかに問題の原因があるのでは?と想像しています。


    > それで思ったのですが,抽出したデータを表示する前にDataGridViewに表示されているデータをすべて表示しないようにするといいのではないかと思うのですが,そのような方法があるでしょうか。

    なかむらさんも書かれてますけど、DataSource を代入する前に null を代入してみるとかでしょうか。

    DataGridView1.DataSource = null; // いったんバインドを解除
    DataGridView1.DataSource = dvKaihi;

    ただし本当は、問題の回避策より原因の特定の方が重要だと考えます。
    仮にこれで回避できたとしても、別の処理時にまた表面化する可能性もあるのではと思いました。

    • 回答としてマーク Koyan 2010年9月24日 20:45
    2010年9月13日 4:09

すべての返信

  • ドロップダウンリストの一部がDataGridViewに重なって表示されるため,その部分のデータが読めません。

    どのようなことが必要でしょうか。お教え願います。

    DataGridViewに表示しているデータの一部が、ComboBoxのドロップダウンリストの下に隠れてしまうのをどうにかしたいということなら、ドロップダウンリストを閉じればいいように思いますが。。。それとも値を取得できないとか?

    どんな問題がおきていて、どんな動作を実現したいのでしょうか?詳細な情報をお願いします。

     


    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年9月7日 1:44
  • 1 ドロップダウンリストから例えば”佐藤”をクリックすると,佐藤に関するデータが抽出されて表示されます。

    2 (1で表示されたとき)ドロップダウンリストは閉じています。

    これが困るのですが

    3 (1でデータが表示されているDataGridViewを見てみると)左上隅のセルに,”月”をあらわす数字が表示されるべきなのに,

    ----
    | 中村 |
    | 田中 | のように,Combobox のリストの一部が表示されているのです。
    ----
    
    
    2010年9月7日 2:14
  • カーソルのある場所が問題のようでした。カーソルを0行目のあちこちの場所に移してみたところそこでも同じような現象が現れるのでした。それで,コードの3行目に

       DataGridView.CurrentCell = null;

    としてみたところ,奇妙な現象が現れることはありませんでした。

    • 回答の候補に設定 nrael 2010年9月7日 4:46
    • 回答の候補の設定解除 Koyan 2010年9月11日 20:45
    2010年9月7日 4:45
  • こちらでは問題を再現させられないのですが、
    nrael さんのところでは再現できたのですね。
    独自の描画処理があるなど、何か再現させる条件があるのでしょうか?

    ちなみに、私がしたテストは、
    新規作成プロジェクトに以下のコードを書いて、Vista 上で実行しました。

    public Form1()
    {
        InitializeComponent();

        var combo = new ComboBox();
        this.Controls.Add(combo);
        combo.Items.AddRange(new[] { "aaa", "bbb", "ccc", "ddd" });

        var dt = new DataTable();
        dt.Columns.Add("col1", typeof(string));
        dt.Columns.Add("col2", typeof(string));
        dt.Columns.Add("col3", typeof(string));
        dt.Rows.Add("aaa", "a", "a");
        dt.Rows.Add("bbb", "a", "a");
        dt.Rows.Add("ccc", "a", "a");
        dt.Rows.Add("ddd", "a", "a");

        var dgv = new DataGridView();
        dgv.TopLeftHeaderCell.Value = "9";
        this.Controls.Add(dgv);
        dgv.Top = combo.Top + combo.Height;
        dgv.DataSource = dt;

        combo.SelectedIndexChanged += (s, e) =>
            {
                dt.DefaultView.RowFilter =
                    string.Format("col1='{0}'", combo.Text);
            };
    }

    あてずっぽうですが、nrael さんのとは別の策として、
    Koyan さんのコードの SelectedIndexChanged 内の DataSource の代入の行の後に
    DataGridView1.Invalidate();
    を入れると直ったりしないでしょうか?

    • 編集済み TH01 2010年9月13日 4:12 コードに1行追加
    2010年9月8日 8:40
  • nraelさん,TH01さん,ありがとうございます。

    >DataGridView1.Invalidate();
    を入れると直ったりしないでしょうか?

    状況に変化はありませんでした。

    >DataGridView.CurrentCell = null;

    リストが表示されることはなくなったのですが,こんどはセルに表示されていたデータと重なってしまいました。

    それで思ったのですが,抽出したデータを表示する前にDataGridViewに表示されているデータをすべて表示しないようにするといいのではないかと思うのですが,そのような方法があるでしょうか。

    2010年9月11日 21:25
  • DataGridView の DataSource プロパティに、null や行数が0のDataTable(DataViewでもいい)をセットすれば、データを表示していない状態にできます。


    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年9月12日 23:34
  • 普通は発生しない現象だと考えています。状況をもう一度教えてもらえますか?

    ●確認1
    「左上隅のセルに,”月”をあらわす数字が表示されるべきなのに」とのことですが、
    dataGridView1.TopLeftHeaderCell.Value = "9";
    のように設定されているのでしょうか?
    それとも、コードで月を描画されているのでしょうか?
    もしくは RowHeadersVisible も ColumnHeadersVisible も false だったりして、左上隅は通常のセルなのでしょうか?

    ●確認2
    現象ですが、コンボボックスのドロップダウンリストの表示内容が、グリッドのセルに「残像」として残るということでしょうか?
    最初のご質問の際は「ドロップダウンリストの一部がDataGridViewに重なって表示される」で、今度は「セルに表示されていたデータと重なってしまう」とのことですが、どちらも同じ「重なる」状態のため、違いがわかりませんでした。
    どのような状況か、もう少しご説明いただけないでしょうか?

    ●確認3
    先の私の返信に書かせていただいたコードは、Koyan さんの状況を表現できていますでしょうか?
    (念のため、返信を修正して TopLeftHeaderCell の行を追加しました。)
    その私のコードでも、Koyan さんの環境では問題の現象が発生するのでしょうか?
    可能性として、Koyan さんのコードのどこかに問題の原因があるのでは?と想像しています。


    > それで思ったのですが,抽出したデータを表示する前にDataGridViewに表示されているデータをすべて表示しないようにするといいのではないかと思うのですが,そのような方法があるでしょうか。

    なかむらさんも書かれてますけど、DataSource を代入する前に null を代入してみるとかでしょうか。

    DataGridView1.DataSource = null; // いったんバインドを解除
    DataGridView1.DataSource = dvKaihi;

    ただし本当は、問題の回避策より原因の特定の方が重要だと考えます。
    仮にこれで回避できたとしても、別の処理時にまた表面化する可能性もあるのではと思いました。

    • 回答としてマーク Koyan 2010年9月24日 20:45
    2010年9月13日 4:09
  • 他のFormでもコンボボックスの選択で抽出表示をおこなっているのですが,そこではこのような不具合が生じることはありません。

    ここではいろいろなことをやっているので,そのことが障害になっているのだと思われますので,最初から書きなおそうと思います。

    なかむらさん,TH01さん,ありがとうございました。

    2010年9月24日 20:43