如果datagridview有一個名為Serial的單元格(2),我想做的是在每一行中。如果序列包含單詞 Meco 或 Melco,它將顯示其他單元格值(Siding / Roof & Trim),但如果它不包含 Meco 或 Melco,那么它會隱藏 Siding & Trim 的值 我嘗試了以下和很多其他的東西.
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
}
但是我沒有任何作業..有人可以幫忙嗎?這基本上是為金屬谷倉和非金屬谷倉訂購金屬,只顯示屋頂顏色。
uj5u.com熱心網友回復:
你說
如果序列包含單詞 Meco 或 Melco,它將顯示其他單元格值,但如果它不包含 Meco 或 Melco,則隱藏該值
在用戶界面級別隱藏和顯示單元格值,您可以處理 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;
}
}
}
uj5u.com熱心網友回復:
謝謝大家的幫助,我很感激..DotNet 開發人員很感激
uj5u.com熱心網友回復:
您可能需要考慮一些與使用網格CellPainting事件來完成此操作相關的事情。對于初學者,該CellPainting事件將觸發很多次,例如當網格獲得焦點或用戶將游標移動到某些單元格上時。
我的觀點是……在網格加載資料之后……然后再次檢查“串行”單元格……當網格獲得焦點或用戶將游標移到某些單元格上……顯然沒有必要。如果在單元格著色時將除錯陳述句放入單元格繪制事件中,您將看到代碼在沒有任何更改時強制重新繪制單元格多次。
接下來,如果用戶在加載資料后確實“更改”了“串行”單元格的值,那么“Siding”和“Trim”單元格的顏色不一定反映正確的顏色。您必須單擊“壁板”和“修剪”單元格才能進行顏色更改。這樣做的原因是,當“串行”單元格值發生變化時,CellPaint事件將觸發……但e.ColumnIndex不會等于“側板”或“修剪”索引的索引……并且這些單元格不會正確著色。
考慮到這一切,我建議采用不同的策略……而不是CellPainting為此使用網格事件,我建議您在代碼中進行這種著色,以避免代碼執行超出需要。然后使用 gridsCellValueChanged事件在“Serial”單元格值更改時更改顏色。然后我們可以輕松一點,因為知道代碼永遠不會被不必要地呼叫。
為了幫助,我建議您創建一個方法,根據需要采用 aDataGridViewRow并為單元格著色。然后,我們可以使用此方法在“串行”單元格值發生變化時為單元格著色,此外還可以使用我們創建的方法來遍歷網格中的所有行并為每一行著色。這種基本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);
}
}
最后,gridsCellValueChanged事件在“串行”單元格更改時為單元格著色。
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) {
if (dataGridView1.Columns[e.ColumnIndex].Name == "Serial") {
ColorCells(dataGridView1.Rows[e.RowIndex]);
}
}
我希望這是有道理的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/479354.html
上一篇:如何讓球彈起來
