以编程方式 select datagridview 中的单元格基于它的值

Programmatically select cell in datagridview based on it's value

我正在使用字符串列表(单个未命名列)在我的 winforms 应用程序中填充一个 dataGridview,但是我需要一种方法来 select 按它的价值出售,以便更改文本颜色.

我该怎么做?

这就是我填充它的方式:

List<String> companyNames = new List<String>();

//.. other logic that fills up companyNames

companyDataGridView.DataSource = this.companyNames.Select(x => new { Value = x }).ToList();

之后,我需要根据从列表中获取的值以某种方式 select 单元格。

您可以在 html 中使用 eval,这意味着您可以在每一行中调用服务器端函数并确定其颜色。

幸运的是我最近已经使用过这个,下面是一个例子:

                <asp:TemplateField HeaderText="Level Achieved">
                    <ItemTemplate>
                        <asp:Label ID="lblActual" runat="server" Text='<%# Bind("Actual") %>' BackColor='<%# GetLevelColour(Eval("Target"),Eval("Actual"))%>'></asp:Label>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:DropDownList ID="ddlAchievedLevel" runat="server">
                        </asp:DropDownList>
                    </EditItemTemplate>
                </asp:TemplateField>

这里可以看到单元格的底色是由函数GetLevelColour返回的值决定的,我也传入了函数中用到的两个参数

这可能是也可能不是您需要的那种功能,但是我对这个问题的解释是当单元格的值等于预定值时如何更改单元格的颜色(在本例中是长度为 2 的单词因为长度被输出到单元格而不是字符串)。

我不太了解 Winforms,但是我尝试了一下。虽然我无法获得绑定字符串的列表,但我可以提取值并与已知值进行比较。这是您正在寻找的东西吗?

private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                if (row.Cells[0].Value.ToString() == "2")
                {
                //To colour the row
                row.DefaultCellStyle.BackColor = Color.Red;

                //To select the row
                row.Selected = true;
                }
            }
        }

这可能不是很漂亮,但我最终把它放在一起.. 它似乎有效。

private DataGridViewCell GetDataGridViewCellByValue(String value, DataGridView dataGridView)
        {
            List<DataGridViewCell> myCells = new List<DataGridViewCell>();
            foreach (DataGridViewRow myRow in dataGridView.Rows)
            {
                foreach (DataGridViewCell myCell in myRow.Cells)
                {
                    myCells.Add(myCell);
                }
            }

            DataGridViewCell returnCell = myCells.FirstOrDefault(x => x.Value.ToString() == value);
            if (returnCell != null)
            {
                return returnCell;
            }
            return null;
        }

然后只需使用下面的这个我就可以获得所需的单元格:

DataGridViewCell testCell = this.GetDataGridViewCellByValue("Company1", this.companyDataGridView);
            if (testCell != null)
            {
                testCell.Style.ForeColor = Color.Blue;
            }

这可能是一个可扩展且快速的解决方案:

Dictionary<string, Color> valuesForColors = new Dictionary<string, Color>();

private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    if (e.FormattedValue != null && valuesForColors.ContainsKey(e.FormattedValue.ToString()))
        e.CellStyle.ForeColor = e.CellStyle.SelectionForeColor = valuesForColors[e.FormattedValue.ToString()];
}