所以,我在C#Win Form应用程序中有一个数据网格视图,默认情况下单元格是可编辑的,现在我想要在这些单元格中输入某些内容时,应将最终值视为大写优先,这意味着如果任何用户类型:
*string => String
example => Example
another => Another
chaRactEr => ChaRactEr*
我可以在Cell Value Changed事件的代码中执行此操作,但是当我在Cell Value Changed事件中执行此操作并将该单元格的值设置为格式化字符串(最终用户需要)时,事件被触发两次。我不能让这件事发生,因为在这个事件中有一个数据库功能触发。 我曾尝试在Cell Leave,Cell Enter和其他事件等其他事件中捕获单元格值,但我永远无法捕获它。
所以我需要知道,如果在C#.NET中存在数据网格视图的任何属性或特性,它会使值的第一个字符为大写? 对此的任何替代建议也将非常有用。
答案 0 :(得分:1)
您可以使用此代码:
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;
}
}
答案 1 :(得分:0)
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;
}
}
答案 2 :(得分:0)
我只能猜测你可能忽略了当代码“改变”调用CellValueChanged
事件的“单元格”中的值时,显然会“再次”触发CellValueChanged
事件将值更改为大写字符串!
要避免此循环引用,只需将事件“关闭”(在更改单元格值之前),更改单元格值...事件将不会触发...然后在值更改后将事件“打开”。
实施例;下面检查单元格是否更改在列0中,更改单元格中的字符串以使第一个字符成为大写字符。该代码使用表单上的文本框,该文本框将包含指示CellValueChanged
事件何时被触发的文本。如果代码以已发布的注释代码运行,则每次第一列中的单元格值更改时,文本框将包含两(2)个条目。联合国评论两行代码将显示文本框条目将只有一(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;
}
}
}