At least one of the DataGridView control's columns has no cell template

41,985

Solution 1

You need to give the type of the column. If you want a textBox column, you'd have to use new DataGridViewTextBoxColumn(). Let's say you want a textBox and a combobox, you'd have the followings:

also, you are calling the first column name over and over again.

    DataGridViewColumn miejsce = new DataGridViewTextBoxColumn();
    miejsce.DataPropertyName = "Miejsce";
    miejsce.HeaderText = "Miejsce";
    miejsce.Name = "miejsceCollumn";

Change the following for the given name.

    DataGridViewColumn imie = new DataGridViewComboBoxColumn();
    imie.DataPropertyName = "Imie";
    imie.HeaderText = "Imię";
    imie.Name = "imieCollumn"

Solution 2

If DataGridView columns are created programmaticaly, then the AutoGenerateColumns property of the DataGridView have to be set on false.

My code is an example of a DataGridView able to display any DataTable and it is working perfectly in this form:

        // Prepare the DataViewGrid
        dataGridView1.Columns.Clear();

        // Add each column to the grid according to the data table structure
        for (int i = 0; i < dataTable.Columns.Count; i++)
        {
            DataGridViewColumn dataGridViewColumn = new DataGridViewColumn();
            DataGridViewCell dataGridViewCell = new DataGridViewTextBoxCell();
            dataGridViewColumn.DataPropertyName = dataTable.Columns[i].ColumnName;
            dataGridViewColumn.HeaderText = dataTable.Columns[i].ColumnName;
            dataGridViewColumn.CellTemplate = dataGridViewCell;
            dataGridViewColumn.Name = dataTable.Columns[i].ColumnName;
            dataGridView1.Columns.Add(dataGridViewColumn);
        }

        // Set the DataSource for the binding
        bindingSource1.DataSource = dataTable;
        // Prevent unwanted columns autogeneration
        dataGridView1.AutoGenerateColumns = false;
        // Provide the binding to the DataGridView
        dataGridView1.DataSource = bindingSource1;

Solution 3

I just needed to set the CellTemplate of the column to resolve the issue.

DataGridViewColumn c = new DataGridViewColumn();
c.Name = "ColumnName";
c.HeaderText = "DisplayText";
c.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
c.CellTemplate = new DataGridViewTextBoxCell();

dataGridView1.Columns.Add(c);
Share:
41,985
Hooch
Author by

Hooch

Updated on August 27, 2021

Comments

  • Hooch
    Hooch over 2 years

    I'm getting that exception.

    System.InvalidOperationException was unhandled
      Message=At least one of the DataGridView control's columns has no cell template.
      Source=System.Windows.Forms
      StackTrace:
           at System.Windows.Forms.DataGridView.CompleteCellsCollection(DataGridViewRow dataGridViewRow)
           at System.Windows.Forms.DataGridView.get_RowTemplateClone()
           at System.Windows.Forms.DataGridView.RefreshRows(Boolean scrollIntoView)
           at System.Windows.Forms.DataGridView.RefreshColumnsAndRows()
           at System.Windows.Forms.DataGridView.OnBindingContextChanged(EventArgs e)
           at System.Windows.Forms.Control.OnParentBindingContextChanged(EventArgs e)
           at System.Windows.Forms.Control.OnBindingContextChanged(EventArgs e)
           at System.Windows.Forms.Control.set_BindingContextInternal(BindingContext value)
           at System.Windows.Forms.ContainerControl.set_BindingContext(BindingContext value)
           at System.Windows.Forms.ContainerControl.get_BindingContext()
           at System.Windows.Forms.Control.get_BindingContextInternal()
           at System.Windows.Forms.Control.get_BindingContext()
           at System.Windows.Forms.DataGridView.DataGridViewDataConnection.SetDataConnection(Object dataSource, String dataMember)
           at System.Windows.Forms.DataGridView.set_DataSource(Object value)
           at Bloowars_Tools.A1_ResultWnd.A1_ResultWnd_Shown(Object sender, EventArgs e) in D:\Documents\Visual Studio 2010\Projects\Bloowars Tools\Bloowars Tools\A1_ResultWnd.cs:line 72
           at System.Windows.Forms.Form.OnShown(EventArgs e)
           at System.Windows.Forms.Form.CallShownEvent()
           at System.Windows.Forms.Control.InvokeMarshaledCallbackDo(ThreadMethodEntry tme)
           at System.Windows.Forms.Control.InvokeMarshaledCallbackHelper(Object obj)
           at System.Threading.ExecutionContext.runTryCode(Object userData)
           at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
           at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
           at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
           at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
           at System.Windows.Forms.Control.InvokeMarshaledCallback(ThreadMethodEntry tme)
           at System.Windows.Forms.Control.InvokeMarshaledCallbacks()
           at System.Windows.Forms.Control.WndProc(Message& m)
           at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
           at System.Windows.Forms.Form.WndProc(Message& m)
           at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
           at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
           at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
           at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
           at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
           at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
           at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
           at System.Windows.Forms.Application.RunDialog(Form form)
           at System.Windows.Forms.Form.ShowDialog(IWin32Window owner)
           at Bloowars_Tools.MainWnd.bt_A1_Wyniki_Click(Object sender, EventArgs e) in D:\Documents\Visual Studio 2010\Projects\Bloowars Tools\Bloowars Tools\Form1.cs:line 165
           at System.Windows.Forms.Control.OnClick(EventArgs e)
           at System.Windows.Forms.Button.OnClick(EventArgs e)
           at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
           at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
           at System.Windows.Forms.Control.WndProc(Message& m)
           at System.Windows.Forms.ButtonBase.WndProc(Message& m)
           at System.Windows.Forms.Button.WndProc(Message& m)
           at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
           at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
           at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
           at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
           at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
           at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
           at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
           at System.Windows.Forms.Application.Run(Form mainForm)
           at Bloowars_Tools.Program.Main() in D:\Documents\Visual Studio 2010\Projects\Bloowars Tools\Bloowars Tools\Program.cs:line 18
           at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
           at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
           at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
           at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
           at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
           at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
           at System.Threading.ThreadHelper.ThreadStart()
      InnerException: 
    

    This is my code:

            public List<Player> PlayerList { get; set; }
    
        public A1_ResultWnd()
        {
            InitializeComponent();
            //GenerateColumns();            
        }
    
        private void GenerateColumns()
        {
            Grid.AutoGenerateColumns = false;
    
            DataGridViewColumn miejsce = new DataGridViewColumn();
            miejsce.DataPropertyName = "Miejsce";
            miejsce.HeaderText = "Miejsce";
            miejsce.Name = "miejsceCollumn";
    
            DataGridViewColumn imie = new DataGridViewColumn();
            miejsce.DataPropertyName = "Imie";
            miejsce.HeaderText = "Imię";
    
            DataGridViewColumn uid = new DataGridViewColumn();
            miejsce.DataPropertyName = "UID";
            miejsce.HeaderText = "UID";
    
            DataGridViewColumn rasa = new DataGridViewColumn();
            miejsce.DataPropertyName = "Rasa";
            miejsce.HeaderText = "Rasa";
    
            DataGridViewColumn sex = new DataGridViewColumn();
            miejsce.DataPropertyName = "Sex";
            miejsce.HeaderText = "Płeć";
    
            DataGridViewColumn klan = new DataGridViewColumn();
            miejsce.DataPropertyName = "Klan";
            miejsce.HeaderText = "Klan";
    
            DataGridViewColumn strefa = new DataGridViewColumn();
            miejsce.DataPropertyName = "Strefa";
            miejsce.HeaderText = "Strefa";
    
            DataGridViewColumn status = new DataGridViewColumn();
            miejsce.DataPropertyName = "Status";
            miejsce.HeaderText = "Status";
    
            Grid.Columns.Add(miejsce);
            Grid.Columns.Add(imie);
            Grid.Columns.Add(uid);
            Grid.Columns.Add(rasa);
            Grid.Columns.Add(sex);
            Grid.Columns.Add(klan);
            Grid.Columns.Add(strefa);
            Grid.Columns.Add(status);
        }
    
        private void A1_ResultWnd_Shown(object sender, EventArgs e)
        {
            GenerateColumns();
            Grid.DataSource = PlayerList; //Here the exception occures
        }
    

    PlayreList is not empty.