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

时间:2009-11-28 17:00:06

标签: winforms datagridview

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

    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";                }
        }
    } 

3 个答案:

答案 0 :(得分:0)

我从 InitializeComponent()之后的两个地方调用了我的 bindGrid()方法,其中构造函数以及 Form1_Load的()即可。这个对我有用。

希望这也会对你有所帮助。

答案 1 :(得分:0)

我没有收到任何回复,所以我发布在另一个论坛上。我最终得到了各种答案,但整个事情仍然很模糊。我得到的答案是,为了保护资源,网格并不总是刷新自己。例如,如果您的表单具有包含2个选项卡的选项卡控件,请在第1个选项卡上放置网格,并在“表单加载”中绑定后设置列属性。这会奏效。但是,当您将网格放在第二个选项卡上时,使用相同的绑定将不起作用:

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

我仍然没有发现它是如何或何时决定保留资源,如果有办法绕过这种行为,如果这种行为记录在任何地方等等。如果有人可以对它投入更多的光,我都是耳朵。

答案 2 :(得分:0)

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

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

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

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

'我在DataReader中执行Sql命令,然后填充DataTable然后将其分配给网格

MyGrid.DataSource = MyDataTable

'现在添加按钮列

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