【问题标题】:How to set the ColumnIndex of a newly added DataGridViewButton column如何设置新添加的 DataGridViewButton 列的 ColumnIndex
【发布时间】:2009-11-28 17:00:05
【问题描述】:

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

【问题讨论】:

  • 有人对此有任何看法或想法吗??

标签: winforms datagridview


【解决方案1】:

我在表单的 constructor 中的 InitializeComponent() 以及 之后的两个地方调用了我的 bindGrid() 方法>form1_load()。这个对我有用。

希望这对你也有帮助。

【讨论】:

    【解决方案2】:

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

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

    我仍然没有发现它决定如何或何时决定保留资源,是否有办法绕过此行为,是否在任何地方记录了此行为等。如果有人可以对此进行更多说明,我会全力以赴。

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题。我最初在单独的表单上有一个 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) 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-16
        • 1970-01-01
        • 2021-04-18
        • 2010-11-21
        • 2013-02-24
        • 2012-06-13
        • 1970-01-01
        相关资源
        最近更新 更多