Ячейка Datagridview становится черной при доступе к EditedFormattedValue? - PullRequest
1 голос
/ 09 июля 2010

У меня есть приложение winforms, которое использует сетку данных.Когда я получаю доступ к EditedFormattedValue ячейки, когда она находится в режиме редактирования, иногда вся ячейка становится черной.Является ли это функцией представления данных, возможно, какой-то функцией проверки, которую мне нужно отключить?

Я нашел несколько других упоминаний этой проблемы во время поиска в Google.Похоже, что ни один из потоков не знает, что ответ на этот вопрос:

Здесь не вызывать 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

enter image description here

Обратите внимание, что есть еще одна причина этого, но поскольку заголовок здесь отредактирован formattedvalue, я сначала отмечу этот пример.

Пример использования 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 (предыдущее редактированиек этому вопросу есть более длинный пример, это более простой пример, который сокращает его быстрее).Ошибка показывает проблему, когда общие настройки автоматического изменения размера установлены на все ячейки, а конкретная установлена ​​на Нет, тогда это может привести к ошибкам в зависимости от того, как вы упорядочите операторы, что должно быть ошибкой.При настройке любого конкретного автоматического размера установите для общего значения значение off.

Пример Black, связанный с изменением размера

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;// A
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;
        */


    }



}


}

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

Ответы [ 2 ]

3 голосов
/ 12 июля 2010

Ну, хотя я не смог понять, почему это происходит с str=dataGridView1.CurrentCell.EditedFormattedValue, я обнаружил, что использование значения str=dataGridView1.EditingControl.Text получает то же значение и не мешает форматированию ячейки. Итак, я думаю, что это решает мою проблему.

1 голос
/ 02 июля 2016

Проблема теперь упоминается здесь

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

Помимо упомянутого dvcolgan обходного пути, который работает только для случая отредактированного форматированного значения.

Существует обходной путь от viorel, упомянутый в ссылке на ошибку ms, который я протестировал и работает, заключающийся в том, чтобы окружить код

 BeginInvoke( new Action( ( ) =>
     {
        . . .
     } ) );

Вышеупомянутая методика BeginInvoke работает в обоих случаях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...