トップ回答者
DataGridViewに表示されているデータをComboBoxのリストで抽出して表示したときの不具合を解消したい

質問
-
下のようにしているとき,
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { dvKaihi.RowFilter = string.Format("氏名='{0}'", comboBox1.SelectedItem.ToString()); DataGridView1.DataSource = dvKaihi; }
ドロップダウンリストの一部がDataGridViewに重なって表示されるため,その部分のデータが読めません。
どのようなことが必要でしょうか。お教え願います。
回答
-
普通は発生しない現象だと考えています。状況をもう一度教えてもらえますか?
●確認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
すべての返信
-
ドロップダウンリストの一部がDataGridViewに重なって表示されるため,その部分のデータが読めません。
どのようなことが必要でしょうか。お教え願います。
DataGridViewに表示しているデータの一部が、ComboBoxのドロップダウンリストの下に隠れてしまうのをどうにかしたいということなら、ドロップダウンリストを閉じればいいように思いますが。。。それとも値を取得できないとか?
どんな問題がおきていて、どんな動作を実現したいのでしょうか?詳細な情報をお願いします。
なかむら(http://d.hatena.ne.jp/griefworker) -
こちらでは問題を再現させられないのですが、
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行追加
-
-
普通は発生しない現象だと考えています。状況をもう一度教えてもらえますか?
●確認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