【问题标题】:How do I set the last row in a DataGridView to a different color?如何将 DataGridView 中的最后一行设置为不同的颜色?
【发布时间】:2014-11-07 04:02:21
【问题描述】:

我找到了很多方法来更改 DataGridView 中的背景颜色,但找不到更改最后一行(条目或添加行)颜色的方法,下面是我的添加联系人按钮的代码。当我改变颜色时,它会改变整个表格。我只想更改最后一行并选择它,以便用户可以简单地开始输入以添加新联系人。

任何帮助将不胜感激。

private void button_Add_Contact_Click(object sender, EventArgs e)
{
    customer_Ship_ContactsDataGridView.AllowUserToAddRows = true;
    customer_Ship_ContactsDataGridView.ReadOnly = false;

    int rowCount = customer_Ship_ContactsDataGridView.Rows.Count;
    customer_Ship_ContactsDataGridView.CurrentCell = customer_Ship_ContactsDataGridView.Rows[rowCount - 1].Cells[0];

    foreach (DataGridViewRow row in customer_Ship_ContactsDataGridView.Rows)
    {
        row.DefaultCellStyle.BackColor = Color.Yellow;
    }

【问题讨论】:

  • 您将网格绑定到表格,因此您应该尝试在表格中添加一行并将其添加到网格中...

标签: c# .net winforms datagridview


【解决方案1】:

您在 cmets 中提到您希望最后一行填充颜色,并且在编辑时颜色也应该存在,并且您希望在通过 Dataset 检索数据时发生这些事情。您还希望在加载表单时关注最后一个可编辑行。 .

.

尝试在单独的项目文件中使用代码,以便您可以看到它是如何工作的。这样做时,创建一个空项目并添加一个 dataGridView1。

 public partial class Form1 : Form
{
    DataSet dSet = new DataSet();
    public Form1()
    {
        InitializeComponent();
        this.Shown += Form1_Shown;
        dataGridView1.AllowUserToAddRows = false;
        dataGridView1.CellBeginEdit += dataGridView1_CellBeginEdit;
        dataGridView1.RowStateChanged += dataGridView1_RowStateChanged;
        dSet = fillDataSet();
        dataGridView1.DataSource = dSet.Tables[0].DefaultView;
        dSet.Tables[0].Rows.Add();
    }

    void Form1_Shown(object sender, EventArgs e)
    {
        dataGridView1.CurrentCell = dataGridView1[0, dataGridView1.Rows.Count - 1];
        dataGridView1.BeginEdit(false);
    }

    DataSet fillDataSet()
    {
        DataSet dSet = new DataSet();
        dSet = new DataSet();
        DataTable table = new DataTable("Names");
        table.Columns.Add("ID");
        table.Columns.Add("Name");
        table.Columns.Add("Gender");
        table.Rows.Add(new object[] { 1, "Salim", "Male" });
        table.Rows.Add(new object[] { 2, "Salim", "Male" });
        table.Rows.Add(new object[] { 3, "Salim", "Male" });
        table.Rows.Add(new object[] { 4, "Salim", "Male" });
        table.Rows.Add(new object[] { 5, "Salim", "Male" });
        table.Rows.Add(new object[] { 6, "Salim", "Male" });
        table.Rows.Add(new object[] { 7, "Salim", "Male" });
        table.Rows.Add(new object[] { 8, "Salim", "Male" });
        dSet.Tables.Add(table);
        return dSet;
    }

    void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
    {
        if (e.ColumnIndex == dSet.Tables[0].Columns.Count - 1)dSet.Tables[0].Rows.Add();
    }

    private void dataGridView1_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e)
    {
        try
        {
            String ssNair = e.StateChanged.ToString();
            if (e.Row.Index > 0)
                dataGridView1.Rows[e.Row.Index - 1].DefaultCellStyle.BackColor = Color.White;
            dataGridView1.Rows[e.Row.Index].DefaultCellStyle.BackColor = Color.Yellow;
        }
        catch { }
    }
}

对于您需要的选项类型,您应该将 AllowUsersToAddRows 属性设置为 false,并根据某些条件添加行。

我在这里添加一个新行,而最后一行的最后一列正在被编辑。

当您与数据集绑定时,无法通过 dataGridView1.Rows.Add() 直接添加行;所以这里的行是使用 DataTable.Rows.Add() 方法添加的。

而且 DataGridView.RowsAdded 事件在使用 Dataset 填充数据时也不起作用,因此使用了 DataGridView.RowStateChanged 事件

【讨论】:

  • 如果你想在所有控件加载后执行一些功能(例如设置焦点)在Shown事件的处理程序中设置焦点而不使用计时器
  • 感谢您扩展此内容。我实际上了解这一切是如何工作的,它只是有一些我不想要的东西......你可以编辑任何或所有行,当你开始在最后一列中输入时,会添加一个新行。但是,这非常有帮助,感谢您抽出宝贵的时间。它让我对 DataGridView 有了更好的理解。
【解决方案2】:

为什么不使用 For 循环而不是 foreach;

int counter = customer_Ship_ContactsDataGridView.Rows.count;

for(int i = 0; i< counter; i++){
if(i == counter){
//this is where your LAST LINE code goes
  row.DefaultCellStyle.BackColor = Color.Yellow;
} else {
//this is your normal code NOT LAST LINE
  row.DefaultCellStyle.BackColor = Color.Red;
}
}

所以基本上你的 for 循环将在每一行迭代 1 次。在最后一次迭代中,它将执行备用代码。

值得注意的是:rows.count 实际上可能是 rows.length 或其他一些措辞来获取该变量的行数,我只是想提醒您注意 for 循环作为一种解决方案。

重新编辑:上面的例子使所有行都变成黄色,最后一行变成红色

【讨论】:

    【解决方案3】:

    这是一个简单而有效的方法 .. 创建 RowsAdded 事件

    public Form1()
        {
            dataGridView1.RowsAdded += dataGridView1_RowsAdded;
        }
    
    void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
        {
            if (e.RowIndex > 0)
                dataGridView1.Rows[e.RowIndex - 1].DefaultCellStyle.BackColor = Color.White;
            dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Yellow;
        }
    

    【讨论】:

    • 这使带 * 的线变成黄色,这是我要走的方向。一旦我开始输入该行,就会添加另一行,黄色行是带有 * 的下一行,因为我越来越接近我所追求的了。
    • 如何先将行添加到数据集中,然后我可以将行着色为黄色并将焦点放在第一列。感谢您的帮助,它正朝着正确的方向发展
    • 嘿,我已经得到了你需要的东西。我把它作为另一个答案
    猜你喜欢
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    相关资源
    最近更新 更多