C# Datagridview 单元格值显示或隐藏其他值
C# Datagridview Cell Value Showing or Hiding Other Value
如果 datagridview 中有一个名为 Serial 的 Cell (2),我想做的是在每一行中。如果序列号包含 Meco 或 Melco 一词,它将显示其他单元格值(Siding / Roof & Trim),但如果它不包含 Meco 或 Melco,则它会隐藏 Siding & Trim I 的值尝试了以下和很多其他的东西。
string s = "MECO";
if (s.Contains("MECO") == true)
{
dataGridView1.Columns[22].Visible = true; // Siding
dataGridView1.Columns[23].Visible = true; // Roof
dataGridView1.Columns[24].Visible = true; // Trim
Console.WriteLine("Word found!");
}
else
{
Console.WriteLine("Word not found!");
dataGridView1.Columns[22].Visible = false; // Siding
dataGridView1.Columns[23].Visible = true; // Roof
dataGridView1.Columns[24].Visible = false; // Trim
}
但是我没有任何工作..有人可以帮忙这基本上是为金属谷仓和非金属谷仓订购金属,只显示屋顶颜色。
你说
If the serial contains the word Meco or Melco it will show the other cell values, but if it DOES NOT contain Meco Or Melco then it hides that values
在用户界面级别隐藏和显示单元格值,您可以处理 DataGridView 的 CellPaint 事件并忽略单元格内容的绘制。这是一个例子,
private void DataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
if (e.RowIndex < 0 || e.RowIndex == dataGridView1.NewRowIndex)
{
return;
}
var s = dataGridView1[serialDataGridViewTextBoxColumn.Index, e.RowIndex].Value as string;
if (s.Contains("MECO") || s.Contains("MELCO"))
{
var flag1 = e.ColumnIndex == sidingDataGridViewTextBoxColumn.Index;
var flag2 = e.ColumnIndex == trimDataGridViewTextBoxColumn.Index;
if (flag1 || flag2)
{
e.Paint(e.ClipBounds, DataGridViewPaintParts.Background | DataGridViewPaintParts.Border);
e.Handled = true;
}
}
}
但是,为了让用户界面更全面,您还可以绘制其他内容而不是单元格的实际内容来表示隐藏值。画什么由你决定。
编辑
根据您提供的图片文件,Serial列为1,Siding列为2,Trim列为4。所以上面的代码应该是
private void DataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
if (e.RowIndex < 0 || e.RowIndex == dataGridView1.NewRowIndex)
{
return;
}
var s = dataGridView1[1, e.RowIndex].Value as string;
if (!(s.Contains("MECO") || s.Contains("MELCO")))
{
if (e.ColumnIndex == 2 || e.ColumnIndex == 4)
{
e.Paint(e.ClipBounds, DataGridViewPaintParts.Background | DataGridViewPaintParts.Border);
e.Handled = true;
}
}
}
谢谢大家的帮助我很感激..DotNet 开发者很感激
您可能需要考虑一些与使用网格 CellPainting
事件来完成此操作相关的事情。对于初学者,CellPainting
事件将触发 many-many 次,例如当网格获得焦点或用户将光标移到某些单元格上时。
我的观点是……在网格加载数据之后……然后再次检查“串行”单元格……当网格获得焦点或用户将光标移到某些单元格上时……显然没有必要。如果您在单元格着色时在单元格绘制事件中放置调试语句,您会看到代码在没有任何更改时 re-paints 多次重写单元格。
接下来,如果用户在加载数据后确实“更改”“Serial”单元格值,则“Siding”和“Trim”单元格的颜色不一定反映正确染色。您必须单击“Siding”和“Trim”单元格才能进行颜色更改。这样做的原因是,当“Serial”单元格的值发生变化时,CellPaint
事件将触发……但 e.ColumnIndex
将不等于“Siding”或“Trim”的索引” 索引……这些单元格将不会正确着色。
考虑到这一切,我建议采用不同的策略...而不是为此使用网格 CellPainting
事件,我建议您在代码中进行这种着色只是为了避免代码执行超出需要的次数。然后使用 grids CellValueChanged
事件在“Serial”单元格值更改时更改颜色。然后我们可以放心一点,因为知道代码永远不会被不必要地调用。
为了提供帮助,我建议您创建一个采用 DataGridViewRow
并根据需要为单元格着色的方法。然后,除了我们创建的循环遍历网格中的所有行并为每一行着色的方法之外,我们还可以在“串行”单元格值更改时使用此方法为单元格着色。这个基本的 ColorCells
方法可能看起来像……
private void ColorCells(DataGridViewRow row) {
if (row.Cells["Serial"].Value != null) {
string serialString = row.Cells["Serial"].Value.ToString();
if (serialString.Contains("MECO") || serialString.Contains("MELCO")) {
row.Cells["Siding"].Style.BackColor = Color.White;
row.Cells["Trim"].Style.BackColor = Color.White;
}
else {
row.Cells["Siding"].Style.BackColor = Color.Black;
row.Cells["Trim"].Style.BackColor = Color.Black;
}
}
}
接下来,我们只需要在数据加载到网格后调用一次的 ColorAllCells
方法...
private void ColorAllCells() {
foreach (DataGridViewRow row in dataGridView1.Rows) {
ColorCells(row);
}
}
最后,当“串行”单元格更改时,网格 CellValueChanged
事件为单元格着色。
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) {
if (dataGridView1.Columns[e.ColumnIndex].Name == "Serial") {
ColorCells(dataGridView1.Rows[e.RowIndex]);
}
}
我希望这是有道理的。
如果 datagridview 中有一个名为 Serial 的 Cell (2),我想做的是在每一行中。如果序列号包含 Meco 或 Melco 一词,它将显示其他单元格值(Siding / Roof & Trim),但如果它不包含 Meco 或 Melco,则它会隐藏 Siding & Trim I 的值尝试了以下和很多其他的东西。
string s = "MECO";
if (s.Contains("MECO") == true)
{
dataGridView1.Columns[22].Visible = true; // Siding
dataGridView1.Columns[23].Visible = true; // Roof
dataGridView1.Columns[24].Visible = true; // Trim
Console.WriteLine("Word found!");
}
else
{
Console.WriteLine("Word not found!");
dataGridView1.Columns[22].Visible = false; // Siding
dataGridView1.Columns[23].Visible = true; // Roof
dataGridView1.Columns[24].Visible = false; // Trim
}
但是我没有任何工作..有人可以帮忙这基本上是为金属谷仓和非金属谷仓订购金属,只显示屋顶颜色。
你说
If the serial contains the word Meco or Melco it will show the other cell values, but if it DOES NOT contain Meco Or Melco then it hides that values
在用户界面级别隐藏和显示单元格值,您可以处理 DataGridView 的 CellPaint 事件并忽略单元格内容的绘制。这是一个例子,
private void DataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
if (e.RowIndex < 0 || e.RowIndex == dataGridView1.NewRowIndex)
{
return;
}
var s = dataGridView1[serialDataGridViewTextBoxColumn.Index, e.RowIndex].Value as string;
if (s.Contains("MECO") || s.Contains("MELCO"))
{
var flag1 = e.ColumnIndex == sidingDataGridViewTextBoxColumn.Index;
var flag2 = e.ColumnIndex == trimDataGridViewTextBoxColumn.Index;
if (flag1 || flag2)
{
e.Paint(e.ClipBounds, DataGridViewPaintParts.Background | DataGridViewPaintParts.Border);
e.Handled = true;
}
}
}
但是,为了让用户界面更全面,您还可以绘制其他内容而不是单元格的实际内容来表示隐藏值。画什么由你决定。
编辑
根据您提供的图片文件,Serial列为1,Siding列为2,Trim列为4。所以上面的代码应该是
private void DataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
if (e.RowIndex < 0 || e.RowIndex == dataGridView1.NewRowIndex)
{
return;
}
var s = dataGridView1[1, e.RowIndex].Value as string;
if (!(s.Contains("MECO") || s.Contains("MELCO")))
{
if (e.ColumnIndex == 2 || e.ColumnIndex == 4)
{
e.Paint(e.ClipBounds, DataGridViewPaintParts.Background | DataGridViewPaintParts.Border);
e.Handled = true;
}
}
}
谢谢大家的帮助我很感激..DotNet 开发者很感激
您可能需要考虑一些与使用网格 CellPainting
事件来完成此操作相关的事情。对于初学者,CellPainting
事件将触发 many-many 次,例如当网格获得焦点或用户将光标移到某些单元格上时。
我的观点是……在网格加载数据之后……然后再次检查“串行”单元格……当网格获得焦点或用户将光标移到某些单元格上时……显然没有必要。如果您在单元格着色时在单元格绘制事件中放置调试语句,您会看到代码在没有任何更改时 re-paints 多次重写单元格。
接下来,如果用户在加载数据后确实“更改”“Serial”单元格值,则“Siding”和“Trim”单元格的颜色不一定反映正确染色。您必须单击“Siding”和“Trim”单元格才能进行颜色更改。这样做的原因是,当“Serial”单元格的值发生变化时,CellPaint
事件将触发……但 e.ColumnIndex
将不等于“Siding”或“Trim”的索引” 索引……这些单元格将不会正确着色。
考虑到这一切,我建议采用不同的策略...而不是为此使用网格 CellPainting
事件,我建议您在代码中进行这种着色只是为了避免代码执行超出需要的次数。然后使用 grids CellValueChanged
事件在“Serial”单元格值更改时更改颜色。然后我们可以放心一点,因为知道代码永远不会被不必要地调用。
为了提供帮助,我建议您创建一个采用 DataGridViewRow
并根据需要为单元格着色的方法。然后,除了我们创建的循环遍历网格中的所有行并为每一行着色的方法之外,我们还可以在“串行”单元格值更改时使用此方法为单元格着色。这个基本的 ColorCells
方法可能看起来像……
private void ColorCells(DataGridViewRow row) {
if (row.Cells["Serial"].Value != null) {
string serialString = row.Cells["Serial"].Value.ToString();
if (serialString.Contains("MECO") || serialString.Contains("MELCO")) {
row.Cells["Siding"].Style.BackColor = Color.White;
row.Cells["Trim"].Style.BackColor = Color.White;
}
else {
row.Cells["Siding"].Style.BackColor = Color.Black;
row.Cells["Trim"].Style.BackColor = Color.Black;
}
}
}
接下来,我们只需要在数据加载到网格后调用一次的 ColorAllCells
方法...
private void ColorAllCells() {
foreach (DataGridViewRow row in dataGridView1.Rows) {
ColorCells(row);
}
}
最后,当“串行”单元格更改时,网格 CellValueChanged
事件为单元格着色。
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) {
if (dataGridView1.Columns[e.ColumnIndex].Name == "Serial") {
ColorCells(dataGridView1.Rows[e.RowIndex]);
}
}
我希望这是有道理的。