【问题标题】:Datagridview cell turns black when accessing EditedFormattedValue?访问 EditedFormattedValue 时 Datagridview 单元格变黑?
【发布时间】: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.AutoSizeRowsMo​​de = DataGridViewAutoSizeRowsMo​​de.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


【解决方案1】:

好吧,虽然我无法弄清楚为什么 str=dataGridView1.CurrentCell.EditedFormattedValue 会发生这种情况,但我发现使用 str=dataGridView1.EditingControl.Text 值会获得相同的值,并且不会与单元格格式混淆。所以,我想这解决了我的问题。

【讨论】:

  • 没有解决我的问题,但我可能有几个来源。
  • 实际上这确实解决了我对文本框和组合框的问题(必须为设置单元格做类似的事情(注意:必须在获取和设置中检查单元格是否处于编辑模式),但是然后,如果我在图像单元格上设置值,我仍然会得到黑框:(
  • 我在 C# WinForms 应用程序中遇到了同样的问题,改用 EditingControl.Text 也解决了我的问题。
  • 我发现您的解决方案对我有用。但是还有一次,即使使用此解决方案,我也遇到了问题,并且遇到了一些其他原因,即某些列自动调整大小而其他列没有。通过使它们全部自动调整大小或全部缩小而不是指定单个列来解决。我在代码中的评论中提到了我在 2016 年 6 月 30 日在这里发布的stackoverflow.com/questions/686309/… 的答案,我想这可能是我们正在解决的 datagridview 中的一个错误
  • 我发现您的解决方案对我有用。但是还有一次,即使使用此解决方案,我也遇到了问题,并且遇到了一些其他原因,即某些列自动调整大小而其他列没有。通过使它们全部自动调整大小或全部缩小而不是指定单个列来解决。我在我在这里发布的答案中提到了这一点(我在 2016 年 6 月 30 日的答案stackoverflow.com/questions/686309/… 的代码中的/* ..*/ 中提到了它,我想这可能是我们正在解决的datagridview 中的一个错误。跨度>
【解决方案2】:

现在这里提到了问题

https://connect.microsoft.com/VisualStudio/feedback/details/2878864/datagridview-cell-goes-black

除了 dvcolgan 提到的仅适用于editedformattedvalue 的解决方法。

在 ms 错误链接中提到了 viorel 的一种解决方法,我已经测试过并且可以使用,即用

包围代码
 BeginInvoke( new Action( ( ) =>
     {
        . . .
     } ) );

上述 BeginInvoke 技术适用于这两种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多