Сделайте первый символ верхнего регистра строки в Win Form DataGridView C# .NET

Итак, у меня есть представление сетки данных в моем приложении C# Win Form, ячейки редактируются по умолчанию, теперь я хочу, чтобы всякий раз, когда что-то вводилось в этой ячейке, конечное значение должно обрабатываться как верхний регистр, поэтому это означает, что если какие-либо типы пользователей :

*string => String
example => Example
another => Another
chaRactEr => ChaRactEr*

Я могу сделать это в своем коде в событии Cell Value Changed, но когда я делаю это в событии Cell Value Changed и устанавливаю значение этой ячейки как форматированную строку (которая требуется от конечного пользователя), событие запускается дважды . Я не могу допустить, чтобы это произошло, поскольку в этом событии срабатывает функция базы данных. Я пытался захватить значение ячейки в другом событии, таком как Cell Leave, Cell Enter и других событиях, но никогда не могу его захватить.

Итак, мне нужно знать, есть ли какое-либо свойство или характеристика представления таблицы данных в C# .NET, которая делает первый символ значения верхним регистром? Любые альтернативные предложения по этому поводу также были бы действительно полезны.

Когда ваш код в событии Cell Value Changed изменяет форматирование, установите флаг и пропустите код базы данных. Когда появляется второй триггер, обнаружите флаг, сбросьте флаг и выполните код базы данных.

peeebeee 02.05.2018 09:12

Другой вариант - создать подклассы правильных классов, чтобы значения всегда сначала устанавливались в верхнем регистре. Вот исходный код DataGridView: linksource.microsoft.com/#System.Windows.Forms

Joel Harkes 02.05.2018 09:13

Вы пытались отключить событие CellValueChanged «до» изменения значения (что, очевидно, запускает его снова), включить его снова «после» изменения значения?

JohnG 03.05.2018 05:55

@JoelHarkes Я стараюсь не зависеть от какого-то флага.

tatasisi 03.05.2018 10:07

@JohnG, вы хотите, чтобы я отключил / включил событие с помощью какого-то флага bool? Или есть команда или код по умолчанию для выключения / включения любого события?

tatasisi 03.05.2018 10:19

@JoelHarkes Мне нравится твоя идея, я попробую.

tatasisi 03.05.2018 10:20

@imcody, чтобы выключить / включить событие ... см. мой ответ ниже. Чтобы отключить событие, используйте ... yourDGVName.CellValueChanged -= new DataGridViewCellEventHandler(yourDGVName_CellValueChanged); ... чтобы снова включить, скопируйте ту же строку и измените -= .. на ... += ... это показано в моем ответе.

JohnG 04.05.2018 02:30
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
601
3

Ответы 3

Вы можете использовать этот код:

        bool bchange = false;
        private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            if (bchange == false)
            {
                bchange = true;
                String oritext = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
                String newtext= oritext.First().ToString().ToUpper() + oritext.Substring (1);
                //Update Database

                //Update cell
                dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = newtext;

            }
            else 
            {
                bchange = false; 
            }
        }

Я очень ценю твой ответ. :-) Я стараюсь не зависеть от какого-то флага. Мой главный вопрос заключался в том, есть ли свойство DataGridView по умолчанию в .NET, которое переводит первый символ ячейки в верхний регистр?

tatasisi 03.05.2018 10:24

DataGridView не существует этого свойства. вы также можете использовать: this.dataGridView1.CellValueChanged - = new System.Windows.Forms.DataGridViewCellEventHandler (this.dataG‌ ridView1_CellValueCh‌ anged); чтобы отключить событие в CellValueChanged. this.dataGridView1.CellValueChanged + = новый System.Windows.Forms.DataGridViewCellEventHandler (this.dataG‌ ridView1_CellValueCh‌ аннулирован); для включения события в CellDoubleClick или ....

D T 03.05.2018 11:16

DataGridView имеет событие CellFormatting. Вы можете сделать что-то вроде этого:

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
    {
        if (e.Value != null)
        {
            string str = (string)e.Value;
            str = char.ToUpper(str[0]) + str.Substring(1);
            e.Value = str;
        }
    }

Вызывается ли это до CellValueChanged или после этого события?

tatasisi 03.05.2018 10:37

Я могу только догадываться, что вы можете пренебречь тем, что, когда код «изменяет» значение в «ячейке», которая вызвала событие CellValueChanged, очевидно, что событие CellValueChanged снова «запускается», когда его значение изменяется на строку в верхнем регистре!

Чтобы избежать этой циклической ссылки, просто выключите событие (перед изменением значения ячеек), измените значение ячеек ... событие не сработает ... затем снова включите событие после изменения значения.

Пример; Ниже проверяется, находится ли измененная ячейка в столбце 0, изменяется строка в ячейке, чтобы сделать первый символ символом верхнего регистра. Код использует текстовое поле в форме, которое будет содержать текст, указывающий, когда запускается событие CellValueChanged. Если код запускается с закомментированным кодом, как опубликовано, текстовое поле будет содержать две (2) записи каждый раз, когда значение ячейки в первом столбце изменяется. UN-комментарий к двум строкам кода покажет, что запись в текстовом поле будет иметь только одну (1) запись. Поместите строку кода, которая «изменяет» значение ячеек, между строкой кода, которая отключает событие, и строкой кода, которая снова включает его. Надеюсь, это имеет смысл.

private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) {
  if (e.RowIndex >= 0 && e.ColumnIndex >= 0) {
    if (e.ColumnIndex == 0 && dataGridView1.Rows[e.RowIndex].Cells[0].Value != null) {
      string currentData = dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString();
      string newData = char.ToUpper(currentData[0]) + currentData.Substring(1);
      //dataGridView1.CellValueChanged -= new DataGridViewCellEventHandler(dataGridView1_CellValueChanged);
      dataGridView1.Rows[e.RowIndex].Cells[0].Value = newData;
      //dataGridView1.CellValueChanged += new DataGridViewCellEventHandler(dataGridView1_CellValueChanged);
      textBox3.Text += "CellValueChanged fired!" + Environment.NewLine;
    }
  }
}

Другие вопросы по теме