1

我在 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
     }
}
4

1 回答 1

1

为了使 Columns 属性可以访问,您需要在 GridView 声明中列出您的列,如下所示,并使用 AutoGenerateColumns="false" 禁用列的自动生成

<Columns>
    <asp:BoundField DataField ="Id" />
    <asp:BoundField DataField ="First" />
    <asp:BoundField DataField ="LastName" />
</Columns>

自动生成列时,您无法访问 Columns 属性。

于 2013-04-02T03:48:37.453 回答