Итак, у меня есть представление сетки данных в моем приложении C# Win Form, ячейки редактируются по умолчанию, теперь я хочу, чтобы всякий раз, когда что-то вводилось в этой ячейке, конечное значение должно обрабатываться как верхний регистр, поэтому это означает, что если какие-либо типы пользователей :
*string => String
example => Example
another => Another
chaRactEr => ChaRactEr*
Я могу сделать это в своем коде в событии Cell Value Changed, но когда я делаю это в событии Cell Value Changed и устанавливаю значение этой ячейки как форматированную строку (которая требуется от конечного пользователя), событие запускается дважды . Я не могу допустить, чтобы это произошло, поскольку в этом событии срабатывает функция базы данных. Я пытался захватить значение ячейки в другом событии, таком как Cell Leave, Cell Enter и других событиях, но никогда не могу его захватить.
Итак, мне нужно знать, есть ли какое-либо свойство или характеристика представления таблицы данных в C# .NET, которая делает первый символ значения верхним регистром? Любые альтернативные предложения по этому поводу также были бы действительно полезны.
Другой вариант - создать подклассы правильных классов, чтобы значения всегда сначала устанавливались в верхнем регистре. Вот исходный код DataGridView: linksource.microsoft.com/#System.Windows.Forms
Вы пытались отключить событие CellValueChanged
«до» изменения значения (что, очевидно, запускает его снова), включить его снова «после» изменения значения?
@JoelHarkes Я стараюсь не зависеть от какого-то флага.
@JohnG, вы хотите, чтобы я отключил / включил событие с помощью какого-то флага bool? Или есть команда или код по умолчанию для выключения / включения любого события?
@JoelHarkes Мне нравится твоя идея, я попробую.
@imcody, чтобы выключить / включить событие ... см. мой ответ ниже. Чтобы отключить событие, используйте ... yourDGVName.CellValueChanged -= new DataGridViewCellEventHandler(yourDGVName_CellValueChanged);
... чтобы снова включить, скопируйте ту же строку и измените -=
.. на ... +=
... это показано в моем ответе.
Вы можете использовать этот код:
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, которое переводит первый символ ячейки в верхний регистр?
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 или ....
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 или после этого события?
Я могу только догадываться, что вы можете пренебречь тем, что, когда код «изменяет» значение в «ячейке», которая вызвала событие 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;
}
}
}
Когда ваш код в событии Cell Value Changed изменяет форматирование, установите флаг и пропустите код базы данных. Когда появляется второй триггер, обнаружите флаг, сбросьте флаг и выполните код базы данных.