加载datagridview并添加组合框

问题描述:

这里是我用来创建一个datagridview,然后添加2组合框的方法。三个DataTables从其他类加载。加载datagridview并添加组合框

public void GetWorkorderItems() 
     { 
     Workorders wo = new Workorders(); 
     ItemTable = wo.LoadWorkorderItemsTable(_ID); 


     this.datagridWorkorderItems.DataSource = ItemTable; 
     this.datagridWorkorderItems.AutoGenerateColumns = true; 
     this.datagridWorkorderItems.Columns[0].Visible = false; 
     this.datagridWorkorderItems.Columns[1].HeaderText = "Qty"; 
     this.datagridWorkorderItems.Columns[1].Width = 100; 
     this.datagridWorkorderItems.Columns[2].HeaderText = "Part"; 
     this.datagridWorkorderItems.Columns[2].Width = 100; 
     this.datagridWorkorderItems.Columns[3].HeaderText = "Labor"; 
     this.datagridWorkorderItems.Columns[3].Width = 100; 
     this.datagridWorkorderItems.Columns[4].HeaderText = "Price"; 
     this.datagridWorkorderItems.Columns[4].Width = 150; 
     this.datagridWorkorderItems.Columns[5].HeaderText = "Description"; 
     this.datagridWorkorderItems.Columns[5].Width = 150; 

     Parts part = new Parts(); 
     DataTable partdata = new DataTable(); 
     partdata = part.LoadPartTable(); 
     DataGridViewComboBoxColumn pcb = (DataGridViewComboBoxColumn)this.datagridWorkorderItems.Columns[2]; 
     pcb.DataSource = partdata; 
     pcb.DisplayMember = "PartName"; 
     pcb.ValueMember = "PartID"; 
     datagridWorkorderItems.Columns.Add(pcb); 

     Labor labor = new Labor(); 
     DataTable data = new DataTable(); 
     data = labor.LoadLaborTable(); 
     DataGridViewComboBoxColumn cb = (DataGridViewComboBoxColumn)this.datagridWorkorderItems.Columns[3]; 
     cb.DataSource = data; 
     cb.DisplayMember = "LaborItem"; 
     cb.ValueMember = "LaborID"; 
     datagridWorkorderItems.Columns.Add(cb); 

     } 

当代码到达创建DataGridViewComboBox的对象的代码退出的方法和不添加或加载组合框。也没有例外抛出。

任何帮助?

编辑* * ** DataGridViewTextBoxColumn COL0 =(DataGridViewTextBoxColumn)this.datagridWorkorderItems.Columns [0]; this.datagridWorkorderItems.Columns [0] .DataPropertyName =“WOItemID”; this.datagridWorkorderItems.Columns [0] .Visible = false; this.datagridWorkorderItems.Columns.Add(col0);

 DataGridViewTextBoxColumn col1 = (DataGridViewTextBoxColumn)this.datagridWorkorderItems.Columns[1]; 
     this.datagridWorkorderItems.Columns[1].DataPropertyName = "Quantity"; 
     this.datagridWorkorderItems.Columns[1].HeaderText = "Qty"; 
     this.datagridWorkorderItems.Columns[1].Width = 100; 
     this.datagridWorkorderItems.Columns.Add(col1); 

     DataGridViewComboBoxColumn pcb = (DataGridViewComboBoxColumn)this.datagridWorkorderItems.Columns[2]; 
     pcb.DataSource = partdata; 
     pcb.DisplayMember = "PartName"; 
     pcb.ValueMember = "PartID"; 
     datagridWorkorderItems.Columns.Add(pcb); 

如果我理解,这可能是构建列的方式。

***固定码,工程* ** * **

public void GetWorkorderItems() 
     { 
     Workorders wo = new Workorders(); 
     ItemTable = wo.LoadWorkorderItemsTable(_ID); 

     Parts part = new Parts(); 
     DataTable partdata = new DataTable(); 
     partdata = part.LoadPartTable(); 

     Labor labor = new Labor(); 
     DataTable data = new DataTable(); 
     data = labor.LoadLaborTable(); 


     this.datagridWorkorderItems.AutoGenerateColumns = false; 

     DataGridViewTextBoxColumn col0 = new DataGridViewTextBoxColumn(); 
     col0.DataPropertyName = "WOItemID"; 
     col0.Visible = false; 
     this.datagridWorkorderItems.Columns.Add(col0); 

     DataGridViewTextBoxColumn col1 = new DataGridViewTextBoxColumn(); 
     col1.DataPropertyName = "Quantity"; 
     col1.HeaderText = "Qty"; 
     col1.Width = 100; 
     this.datagridWorkorderItems.Columns.Add(col1); 

     DataGridViewComboBoxColumn col2 = new DataGridViewComboBoxColumn(); 
     col2.DataPropertyName = "PartID"; 
     col2.DataSource = partdata; 
     col2.DisplayMember = "PartName"; 
     col2.ValueMember = "PartID"; 
     col2.HeaderText = "Part"; 
     datagridWorkorderItems.Columns.Add(col2); 

     DataGridViewComboBoxColumn col3 = new DataGridViewComboBoxColumn(); 
     col3.DataPropertyName = "LaborID"; 
     col3.DataSource = data; 
     col3.DisplayMember = "LaborItem"; 
     col3.ValueMember = "LaborID"; 
     col3.HeaderText = "Labor"; 
     datagridWorkorderItems.Columns.Add(col3); 

     DataGridViewTextBoxColumn col4 = new DataGridViewTextBoxColumn(); 
     col4.DataPropertyName = "Price"; 
     col4.HeaderText = "Price"; 
     col4.Width = 100; 
     this.datagridWorkorderItems.Columns.Add(col4); 

     DataGridViewTextBoxColumn col5 = new DataGridViewTextBoxColumn(); 
     col5.DataPropertyName = "Description"; 
     col5.HeaderText = "Description"; 
     col5.Width = 100; 
     this.datagridWorkorderItems.Columns.Add(col5); 

     this.datagridWorkorderItems.DataSource = ItemTable; 

     } 
+0

好了一件事我看到,立即脱颖而出的是,你是au生成列(除非你需要文本框,这通常是一件危险的事情)。生成列之后,然后选择其中一列(不检查其类型)并将其转换为datagridview列。你应该给我们一个“if(col是DataGridViewComboBoxColumn){...}”以避免错误。我愿意打赌它失败,因为你正在阅读一个现有的专栏。尝试在不自动生成列的情况下执行此操作。 –

+0

谢谢本杰明·危险约翰逊。所以基本上,当我为列设置属性时,应该事先生成所有列类型?这似乎是有道理的。 – Ryan

+0

坚持,让我看看我是否可以编程一个答案。 –

尝试是这样的:

public ExampleForm() 
    { 
     InitializeComponent(); 
     datagridWorkorderItems.AutoGenerateColumns = false; 

     DataGridViewTextBoxColumn qtyColumn = new DataGridViewTextBoxColumn(); 
     qtyColumn.DataPropertyName = "Qty"; 
     qtyColumn.HeaderText = "Qty"; 
     datagridWorkorderItems.Columns.Add(qtyColumn); 

     DataGridViewComboBoxColumn partColumn = new DataGridViewComboBoxColumn(); 
     partColumn.Items.Add(new Part() { ID = 0, PartName = "Tire" }); 
     partColumn.Items.Add(new Part() { ID = 1, PartName = "Motor" }); 
     partColumn.HeaderText = "Part"; 
     partColumn.DataPropertyName = "PartID"; 
     partColumn.ValueMember = "ID"; 
     partColumn.DisplayMember = "PartName"; 
     datagridWorkorderItems.Columns.Add(partColumn); 

     List<WorkOrder> workOrders = new List<WorkOrder>(); 
     workOrders.Add(new WorkOrder() { Qty = 0, PartID = 0}); 
     workOrders.Add(new WorkOrder() { Qty = 2, PartID = 1}); 

     datagridWorkorderItems.DataSource = workOrders; 
    } 
} 

public class WorkOrder 
{ 
    public int Qty { get; set; } 
    public int PartID { get; set; } 
} 

public class Part 
{ 
    public int ID { get; set; } 
    public string PartName { get; set; } 
} 
+0

我明白你在做什么,这很有道理。如果我需要绑定到DataTable并从数据源加载我的组合框,该怎么办?简单地将datagridview绑定到数据表生成列?如果我在代码中创建列,如何告诉datagridview来订购新列?它是否按列创建顺序添加并显示列集合? – Ryan

+0

只要您将AutoGenerateColumns设置为false,它们就不会生成。你可以绑定一个DataTable,只要确保“DataPropertyName”被设置为feild来从中提取数据。当您在组合框项目上使用数据绑定时,将项目值设置为“ValueMember”(您将在DataPropertyName设置的字段中存储的值)和“DisplayMemeber”设置为项目将显示的文本。现在我要出去吃午饭了,我会在一小时后回来看看你是否有更多问题。 –

+0

这很酷,这是有道理的。我会把它连接起来并回传。 – Ryan