Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将DataGridView中的最后一行设置为不同的颜色?_C#_.net_Winforms_Datagridview - Fatal编程技术网

C# 如何将DataGridView中的最后一行设置为不同的颜色?

C# 如何将DataGridView中的最后一行设置为不同的颜色?,c#,.net,winforms,datagridview,C#,.net,Winforms,Datagridview,我已经找到了很多方法来更改DataGridView中的背景颜色,但是找不到一种方法来更改最后一行(条目或添加行)的颜色。下面是我添加联系人按钮的代码。当我改变颜色时,它会改变整个桌子。我只想更改最后一行,并将其选中,以便用户只需开始键入即可添加新联系人 任何帮助都将不胜感激 private void button_Add_Contact_Click(object sender, EventArgs e) { customer_Ship_ContactsDataGridView.Allow

我已经找到了很多方法来更改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;
    }

为什么不使用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;
}
}
int counter=customer\u Ship\u ContactsDataGridView.Rows.count;
对于(int i=0;i
因此,基本上,for循环将在每行中迭代1次。在最后一次迭代中,它将执行备用代码

值得注意的是:rows.count实际上可能是rows.length或其他一些措辞为了将行数放入该变量中,我只是想让您注意for循环作为解决方案


重新编辑:上面的示例使所有行变黄,最后一行变红 .. 创建一个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;
    }

您在评论中提到,您希望最后一行填充一种颜色,并且在编辑时颜色也应该在那里,并且您希望在通过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事件,将网格绑定到表中,因此您应该尝试向表中添加一行,并将其添加到网格中……这使带有*的行变为黄色,这是我尝试的方向。一旦我开始输入行,另一行现在被添加,黄色行是带有*的下一行,这是确定的,因为我正在接近我想要的。我如何首先将行添加到数据集中,然后我可以将行涂成黄色,并将焦点放在第一列。谢谢你的帮助,它正朝着正确的方向前进。嘿,我正好有你需要的。。如果您想在加载所有控件(例如设置焦点)后执行某个函数,我将其作为另一个答案。请在
显示的
事件的处理程序中设置焦点,而不使用计时器。感谢您将此扩展。事实上,我理解了这一切是如何运作的,它只是有一些我不想要的东西…你可以编辑任何或所有行,当你开始在最后一列中键入一个新行时。不过,这非常有帮助,感谢您抽出时间。它让我对DataGridView有了更好的理解。