【发布时间】:2010-07-08 20:36:20
【问题描述】:
我有一个使用 datagridview 的 winforms 应用程序。当我在编辑模式下访问单元格的 EditedFormattedValue 时,有时整个单元格会变黑。这是 datagridview 的一个功能,也许是我需要关闭的某种验证功能?
我在谷歌搜索时发现了其他几个提到这个问题的地方。似乎没有一个线程知道答案是什么:
这里没有调用 Application.DoEvents 解决了问题,但我没有调用 DoEvents。
http://www.tek-tips.com/viewthread.cfm?qid=1277303&page=1
http://social.msdn.microsoft.com/Forums/en/winformsdatacontrols/thread/d9bf784d-617d-4a35-8125-fe8f67987fa2
没有人知道为什么会这样,但响应者建议将背景颜色设置为白色。这似乎是一个黑客,我想知道为什么会这样。此外,更改背景颜色并不会为我移除黑色背景。
由 barlop 添加
注意还有另外一个原因,但是由于这里的标题是editedformattedvalue,所以我先记下这个例子。
以 EditedFormattedValue 为原因的示例。
(当你双击单元格时,(从而进入编辑模式),它会变黑)
namespace simpleblackdgv2
{
public partial class Form1 : Form
{
DataGridView dataGridView1 = new DataGridView();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// BUG IS THAT WHEN YOU DOUBLE CLICK A CELL, IT GOES BLACK
dataGridView1.Columns.Add("Column1", "Column1");
dataGridView1.Rows.Add(1);
dataGridView1.AllowUserToAddRows = false;
this.Controls.Add(dataGridView1);
dataGridView1.EditingControlShowing += DataGridView1_EditingControlShowing;
}
private void DataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
// doesn't work
string str = dataGridView1.CurrentCell.EditedFormattedValue.ToString();
}
}
}
在相关说明中,这是另一个变黑的例子,尽管不是来自editedformattedvalue(之前对这个问题的编辑有一个更长的例子,这是一个更简单的例子,可以更快地切入它)。当常规自动调整大小设置打开时,该错误会显示一个问题 - 设置为 allcells,而特定的设置为 None,然后根据您对语句的排序方式,它可能会出现错误,这一定是一个错误。设置任何特定的自动调整大小时,请将常规设置为关闭。
与调整大小相关的示例黑色
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
namespace blackdgvcellexample {
public partial class Form1 : Form {
DataGridView dataGridView1;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// autosize rows may be meaningless without that.
//dataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
dataGridView1 = new DataGridView();
this.Controls.Add(dataGridView1);
dataGridView1.Columns.Add("Column1", "Column1");
dataGridView1.Columns.Add("Column2", "Column2");
dataGridView1.Columns.Add("Column3", "Column3");
dataGridView1.AllowUserToAddRows = false;
dataGridView1.Rows.Add(5);
//dataGridView1.Rows.Add(1);
dataGridView1.EditingControlShowing += DataGridView1_EditingControlShowing;
}
private void DataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
dataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
//dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; //A
// dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; //B
// dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells; //C
// B-Cols, C-rows
// A, ~B, ~C WORKS
// A,B, ~C WORKS
// A,~B,C WORKS
// A,B,C WORKS
// SO IT WAS THE ORDER OF THE LINES THAT MAKES A DIFFERENCE!!!!
// --- trying not turning any off
// dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; //A
// dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; //B
// dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells; //C
// Cols, Rows, A BLACK FIRST CELL REST FINE
// rows, Cols, A BLACK FIRST CELL REST FINE
// cols,A,rows FINE
// rows,A,cols BLACK FIRST CELL REST FINE
// A, rows, cols BLACK FIRST CELL
// A, cols, rows FINE
// perhaps unnecessary to autoaize rows.
dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; //A
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
// this works
/*
dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; //一个
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
*/
/*
* this works
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; //A
*/
/*
doesn't work
dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; //A
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
*/
// doesn't work
// dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
// dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; //A
// so don't mix them. ok
// this doesn't work
// dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
// dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; //A
// these 3 work in any order
// dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
// dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
// dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; //A
// don't mix them.
// if you are going to mix them, then turn the generals off and do specifics.
// this won't work
// dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
// dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
// dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.None; //A
// this works, probably any order too.
/*
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
dataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
dataGridView1.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
*/
}
}
}
相关-https://connect.microsoft.com/VisualStudio/feedback/details/2878864/datagridview-cell-goes-black
【问题讨论】:
-
请注意,在列调整大小示例中,可以通过缩小整个内容来避免这种情况(或者通过弄清楚为什么只有一个列并解决这个问题,尽管还没有找到答案)
标签: vb.net winforms datagridview