【问题标题】:At least one of the DataGridView control's columns has no cell templateDataGridView 控件的至少一列没有单元格模板
【发布时间】:2012-01-17 09:57:00
【问题描述】:

我遇到了那个异常。

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: 

这是我的代码:

        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 不为空。

【问题讨论】:

    标签: c# winforms exception collections datagridview


    【解决方案1】:

    您需要提供列的类型。如果你想要一个文本框列,你必须使用new DataGridViewTextBoxColumn()。假设您想要一个文本框和一个组合框,您将拥有以下内容:

    另外,您一遍又一遍地调用第一个列名。

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

    为给定名称更改以下内容。

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

    【讨论】:

      【解决方案2】:

      如果 DataGridView 列是通过编程方式创建的,则必须将 DataGridView 的 AutoGenerateColumns 属性设置为 false。

      我的代码是一个可以显示任何 DataTable 的 DataGridView 示例,它在这种形式下运行良好:

              // 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;
      

      【讨论】:

      • AutoGenerateColumns property of the DataGridView have to be set on false. 谢谢!这让我的工作......多么奇怪的错误
      【解决方案3】:

      我只需要设置列的CellTemplate 即可解决问题。

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

      【讨论】:

        【解决方案4】:

        您可以使用此代码通过 set CellTemplate 在网格中添加列:

        Grid.Columns.Add(new DataGridViewColumn() { CellTemplate = new 
        DataGridViewTextBoxCell() , HeaderText = "Miejsce" , Name = "miejsceCollumn" ,  
        AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-13
          • 2012-11-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多