如何设置新添加的DataGridViewButton列的ColumnIndex

问题描述:

我对DataGridView控件中的按钮单元格有一个非常恼人的问题。我在运行时将网格绑定到数据集。网格中的一些行将链接到pdf文档。我创建一个按钮列并将其添加到网格中,然后循环遍历行并基于某个列的值,我在按钮列中设置单元格的文本。当我浏览代码时,我可以看到按钮列的ColumnIndex是10.但是当表单出现时,我想要的行的按钮文本值是空白的。 当我点击按钮时,检查CellContentClick事件以查看ColumnIndex是否为10(它是按钮列),它告诉我ColumnIndex是0,即使它是最后一列。然后,当我重新加载网格时,我再次调用BindHistoryGrid方法,如果它存在并重新添加它,该方法将删除该列。这一次它正确设置按钮文本。是否有一些我看不见的奇怪行为?如何在第一次添加按钮时将按钮ColumnIndex设置为10(即使它告诉我它是10)?如何设置新添加的DataGridViewButton列的ColumnIndex

private DataGridViewButtonColumn PDFButtonColumn; 

    private void BindHistoryGrid() 
    { 
     dataGridViewStmt.DataSource = ah.getAccountHistory(0, dateTimePicker1.Value, dateTimePicker2.Value); 

     if (dataGridViewStmt.Columns["GetPDFFile"] != null) 
      dataGridViewStmt.Columns.Remove("GetPDFFile"); 

     dataGridViewStmt.Columns[0].DisplayIndex = 0; 
     dataGridViewStmt.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; 
     dataGridViewStmt.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells); 
     dataGridViewStmt.Columns[0].Visible = false; 
     dataGridViewStmt.Columns[1].Visible = false; 
     dataGridViewStmt.Columns.Add(PDFButtonColumn); 

     dataGridViewStmt.RowHeadersVisible = false; 
     dataGridViewStmt.ReadOnly = true; 
     dataGridViewStmt.AllowUserToAddRows = false; 

     foreach (DataGridViewRow row in dataGridViewStmt.Rows) 
     { 
      //if (((string)row.Cells[5].Value).Contains("Invoice")) 
      if (((int)row.Cells[9].Value) > 0) 
      { 
       ((DataGridViewButtonCell)(row.Cells[10])).Value = "Get Invoice"; 
      } 
      else 
      { 
       ((DataGridViewButtonCell)(row.Cells[10])).Value = ""; 
      } 
     } 
    } 


    private void dataGridViewStmt_CellContentClick(object sender, DataGridViewCellEventArgs e) 
    { 
     if (e.ColumnIndex == 10 && dataGridViewStmt.CurrentRow.Cells[6].Value != System.DBNull.Value) 
     { 
      string pdfFile = ""; 
      int docID = 0; 

      pdfFile = (string)dataGridViewStmt.CurrentRow.Cells[5].Value + ".pdf"; 
      docID = (int)dataGridViewStmt.CurrentRow.Cells[9].Value; 

      if (docID > 0) 
      { 
       getPDFFile(docID, pdfFile, "pdf"); 
      } 
      else 
      { 
       MessageBox.Show("No invoice available for this item";    } 
     } 
    } 
+0

任何人有任何意见或想法? – 2009-11-30 19:35:49

我打电话给我的bindGrid()从两个地方一个方法的InitializeComponent()后形式的构造以及来自Form1_Load的()。这个对我有用。

希望这也能帮助你。

我没有得到任何答复,所以我发布在另一个论坛上。我最终得到了一个答案,但整个事情仍然非常模糊。我得到的答案说,为了保护资源,电网并不总是自我更新。一个示例是,如果您有一个带有两个选项卡的选项卡控件的表单,请在第一个选项卡上放置网格,然后在“表单加载”中进行绑定后设置列属性。这将工作。但是,当你把第二个选项卡上的网格,使用相同的绑定将无法工作:

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/99ab9fbf-9eaa-4eef-86b8-8f4e49fa81c5

我还没有找到如何或何时决定以保存资源,如果有一种方法绕过这种行为,如果这种行为记录在任何地方等。如果任何人都可以抛出更多的光线,我都耳朵。

我有同样的问题。我最初在一个单独的窗体上有一个DataGridView,并且它完美地处理了按钮列 - 我在设置数据源之后添加了代码。但是,当我决定将网格移动到具有选项卡式控件的另一个表单上时(按Tab键(在选项卡(2)页面上),按钮列索引保持恢复为零。当然,在正确的物理位置上,它看起来完全没问题,如果我在调试模式下遍历代码,Index没有改变,但是当我运行该程序时,它确实改变了!非常令人沮丧。

我通过将标签页设置为我的网格所在的页面来解决它之前设置数据源。

我的简单的过程是这样的(I使用VB10):

TabControl1.SelectedIndex = 2 ' this is where the datagridview is 
MyGrid.DataSource = Nothing 
MyGrid.Columns.Clear 

“我执行SQL命令到一个DataReader,然后填写一个DataTable,然后将其分配到电网

MyGrid.DataSource = MyDataTable 

'现在添加按钮列

Dim btnCol as New DatGridViewButtonColumn 
MyGrid.Columns.Add(btnCol)