2011-12-10 5 views
16

Tôi nhận được ngoại lệ đó.Ít nhất một trong các cột của điều khiển DataGridView không có mẫu ô

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: 

Đây là mã của tôi:

 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 là không có sản phẩm nào.

Trả lời

46

Bạn cần cung cấp loại cột. Nếu bạn muốn cột textBox, bạn phải sử dụng new DataGridViewTextBoxColumn(). Giả sử bạn muốn một hộp văn bản và hộp tổ hợp, bạn sẽ có các thông tin sau:

cũng, bạn đang gọi tên cột đầu tiên lặp đi lặp lại.

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

Thay đổi tên sau cho tên đã cho.

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

Nếu cột DataGridView được tạo ra programmaticaly, sau đó là tài sản của DataGridView AutoGenerateColumns phải được đặt trên sai.

Mã của tôi là một ví dụ về một DataGridView có thể hiển thị bất kỳ DataTable và nó đang làm việc một cách hoàn hảo theo hình thức này:

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

'AutoGenerateThuộc tính của DataGridView phải được đặt sai.' Cảm ơn bạn! Điều này đã làm việc của tôi ... những gì một lỗi lạ – Luke

0

Tôi chỉ cần thiết để thiết lập các CellTemplate của cột để giải quyết vấn đề này.

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