我有一个datagridview,显示“库”中书籍的信息。但是由于某种原因,第一次加载表单时,它会显示我在第一列而不是最后一列中的按钮列,以及按钮列中的所有按钮都处于活动状态。当我通过单击另一个按钮加载表单后调用相同的方法时,它按照预期显示datagridview,其中按钮列是最右列,书籍副本为0,按钮列中的按钮被禁用。之后它继续完美地工作,从来没有在第一次加载。
以下是该方法的代码:
/// <summary>
/// Sets datagrid to show all books that have available copies. Adds buttons to the last columns. Resizes datagrid.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void showAvailCopies_Click(object sender, EventArgs e)
{
this.dataGrid.Columns.Clear();
this.dt.set_availableBookView(); // dt is a datable and set_availBookView is an extension method I wrote to set up the columns of the table.
foreach (Book book in this.bookService.getAll())
{
this.dt.Rows.Add(
book.Title,
book.Author.Name.ToString(),
book.ISBN,
this.copyService.getAvailableCopies(book.Title).Count(),
loanService.numOfLoansByBook(book.Title)
);
}
this.addButtonColumn("Loan", "Loan Book"); // Goes through the usual add button column code with parameters to set the button text and button column header.
this.dataGrid.DataSource = dt;
foreach (DataGridViewRow row in this.dataGrid.Rows)
{
if (row.Cells["Copies Available"].Value.ToString() == "0")
{
DataGridViewDisableButtonCell buttonCell =
(DataGridViewDisableButtonCell)row.Cells["Loan Book"];
buttonCell.Enabled = false;
buttonCell.Style.BackColor = Color.Red;
}
}
this.autoSizeGrid();
}
从数据库加载数据(通过bookService.getAll()
完成)加载数据的速度是否比加载按钮列的速度慢?因此,当我在可用副本列中检查0时,它永远不会返回true?
我意识到我没有展示相当数量的代码。我希望也许这将是一件简单的事情,我会丢失,而不是在这里转储大量的代码。如果您需要查看我的任何其他方法的任何代码,请告诉我。
答案 0 :(得分:1)
在我看来,你想要在渲染之前更新网格(第一次)。在后续帖子上它可以工作,因为网格已经被渲染,虽然在上一个回发后。我的猜测是第一次,你的foreach循环实际上并没有循环通过任何东西?
这个答案描述了如何连接RowAdded事件,你可以用它来执行你的按钮逻辑(即使我的诊断错误,这也值得一看!)