Hi All,
In my application, i have a datagridview with 5 colums, at the form load the datagridview contains one row, I am showing a combobox in each of the 4 columns to select the values (i doesnot type any thing in that 4 columns), when i press tab the focus goes from column 4 to column 5.
Now when again i press tab the focus leaves the datagridview, but here i want that when i leave the column 5, there must be a row added.
How can i do that, can anyone help me on that?
Thanks in advance.
Regards,
Vidya

Recommended Answers

All 9 Replies

Not sure why your datagridview doesn't always have an unpopulated record shown. Check this code. As soon as you type anything in a cell, it will append a new unpopulated record/row to the end of the grid, which will again repeat as soon as you type anything in the new row...

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ForumSolutions
{
    public class Form_DataGridView_AddRow : Form
    {
        public Form_DataGridView_AddRow()
        {
            InitializeComponent();
        }

        private void dataGridView1_KeyPress(object sender, KeyPressEventArgs e)
        {

        }

        #region Designer generated code

        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.dataGridView1 = new System.Windows.Forms.DataGridView();
            this.Column1 = new System.Windows.Forms.DataGridViewTextBoxColumn();
            this.Column2 = new System.Windows.Forms.DataGridViewTextBoxColumn();
            this.Column3 = new System.Windows.Forms.DataGridViewTextBoxColumn();
            ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
            this.SuspendLayout();
            // 
            // dataGridView1
            // 
            this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
            this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
            this.Column1,
            this.Column2,
            this.Column3});
            this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill;
            this.dataGridView1.Location = new System.Drawing.Point(0, 0);
            this.dataGridView1.Name = "dataGridView1";
            this.dataGridView1.Size = new System.Drawing.Size(489, 278);
            this.dataGridView1.TabIndex = 0;
            this.dataGridView1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.dataGridView1_KeyPress);
            // 
            // Column1
            // 
            this.Column1.HeaderText = "Column1";
            this.Column1.Name = "Column1";
            // 
            // Column2
            // 
            this.Column2.HeaderText = "Column2";
            this.Column2.Name = "Column2";
            // 
            // Column3
            // 
            this.Column3.HeaderText = "Column3";
            this.Column3.Name = "Column3";
            // 
            // Form_DataGridView_AddRow
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(489, 278);
            this.Controls.Add(this.dataGridView1);
            this.Name = "Form_DataGridView_AddRow";
            this.Text = "Form_DataGridView_AddRow";
            ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
            this.ResumeLayout(false);

        }

        #endregion

        private System.Windows.Forms.DataGridView dataGridView1;
        private System.Windows.Forms.DataGridViewTextBoxColumn Column1;
        private System.Windows.Forms.DataGridViewTextBoxColumn Column2;
        private System.Windows.Forms.DataGridViewTextBoxColumn Column3;

        #endregion // Designer code
    }
}

You could also override the tab behavior of your form. In my case this DataGridView is databound to "dt" which is a datatable. You'll have to handle the adding of a new row depending on how you implemented the grid:

protected override bool ProcessTabKey(bool forward)
    {
      if (forward && (this.ActiveControl == dataGridView1)) //Stop it from advancing
      {
        DataRow row = dt.NewRow();
        dt.Rows.Add(row);
        int idx = dataGridView1.Rows.GetLastRow(DataGridViewElementStates.Visible);
        dataGridView1.Rows[idx].Selected = true;
        return false;
      }
      else
      {
        return base.ProcessTabKey(forward);
      }
    }

Thanks SKnake

But In DatagridView There Is No Datatable Please Give Me Answer

Is your grid databound to a DataTable, DataSet, etc? Or are you manually populating the rows?

The records are not fetched from database, only thing is that i want to add row on the cell leave event of the last column without writing any thing in any cell of the row. The data in first 4 columns are added by using combo boxes which i make visible on keypress of particular cell.

This should do the trick:

protected override bool ProcessTabKey(bool forward)
    {
      if (forward && (this.ActiveControl == dataGridView1)) //Stop it from advancing
      {
        int idx = dataGridView1.Rows.Add();
        dataGridView1.Rows[idx].Selected = true;
        return false;
      }
      else
      {
        return base.ProcessTabKey(forward);
      }
    }

You're welcome

Please mark this thread as solved if we have answered your question and good luck!

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.