我在 4.5 框架上的 VS2012 中自学 C# 并喜欢它,但这(继续)让我感到困惑,所以如果我遗漏了一些明显的东西,我深表歉意。我做了一些新的测试(自我最初的帖子 3/23 以来),现在更加困惑。
我在名为reviews.xsd 的项目中添加了一个DataSet 项。
我以编程方式使用 Review 表中的所有数据填充 DataSet,然后将两个新字段添加到 Columns 集合中,然后使用 EntityFramework 加入 Book 表以添加这两个新字段的数据。我以编程方式将 GridView 控件 (dgvReviews) 链接到这个填充的 DataSet,当我打开页面时,一切都显示得很好,因此所有数据填充到 DataSet 中,链接的 GridView 控件运行良好。
但是,GridView 控件的 Columns 集合奇怪地是 EMPTY,因此我无法更改列的样式或使用 Visible 属性隐藏或显示它们。填充 GridView 的 DataSet 的 Columns 集合是完整的,这些值可以正常访问。
我已经设置了许多 Watches 来查看 GridView 控件的其他属性,它们似乎正在正常填充:例如,Rows 集合通过 Watch 窗口显示值,但对 Columns 集合的所有访问都显示“枚举没有产生结果” 即使数据全部正确显示(当我不尝试在代码中显式访问 Columns 集合时)。
我是一个初级程序员,所以任何建议都将不胜感激。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
// create reviews dataset, populate with standard data from Review table
reviews reviewDataSet = new reviews();
reviewsTableAdapters.reviewTableAdapter reviewDataAdapter = new reviewsTableAdapters.reviewTableAdapter();
reviewDataAdapter.Fill(reviewDataSet.review);
reviewDataSet.review.Columns.Add("bookName", typeof(string));
reviewDataSet.review.Columns.Add("bookDescription", typeof(string));
reviewDataSet.review.Columns["bookName"].SetOrdinal(3);
reviewDataSet.review.Columns["bookDescription"].SetOrdinal(4);
// use EF to populate data from Book table into new bookName and bookDescription fields
bookReviewsEntities bookConnection = new bookReviewsEntities();
foreach (reviews.reviewRow reviewEntry in reviewDataSet.review)
{
int bookNumber = reviewEntry.bookID;
var bookLookup = (from book in bookConnection.books
where book.bookID == bookNumber
select book).ToList();
reviewEntry.BeginEdit();
reviewEntry["bookName"] = bookLookup[0].title;
reviewEntry["bookDescription"] = bookLookup[0].description;
reviewEntry.EndEdit();
}
bookConnection.Dispose();
// next 2 lines verify the Columns collection of the DataSet is working fine
string test1 = reviewDataSet.review.Columns[0].ToString();
string test2 = reviewDataSet.review.Columns[1].ToString();
dgvReviews.DataSource = reviewDataSet.review;
dgvReviews.DataBind();
// everything runs and displays normally if next line is commented out
dgvReviews.Columns[0].Visible = false; // crashes with "index out of range" since "Columns" collection is empty
}
}