【问题标题】:GridView displaying only first retrieved recordGridView 仅显示第一个检索到的记录
【发布时间】:2013-12-12 23:40:20
【问题描述】:

我成功地从我的数据库中检索到我需要的所有记录,但是我的GridView 中只显示了一条记录。

过去几天我一直在尝试解决这个问题,但我真的很沮丧,因为我没有办法尝试。我迫切需要一些帮助。

我试图操纵查询,因为我最初认为这是问题所在,试图将我从IQueryable检索到的数据转换为List<MyObject>(),试图在@987654326的末尾添加.Cast<object>().ToList(); @,甚至尝试使用ViewStates,等等!

请任何人帮忙。

我确实有onRowDataBoundselectedIndexChanged 事件为GridView,因为我读到它们可能会导致这个问题。

下面是我的代码:

GridView

gvSubCategories.DataSource = new BASubCategory().GetSubCatWithCatName();
gvSubCategories.DataBind();


protected void gvSubCategories_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        SubCategory currentSubCat = (SubCategory)e.Row.DataItem;

        //Image img = (Image)e.Row.FindControl("imgSubCategory");
        //img.ImageUrl = currentSubCat.ImageURL;
    }
}

protected void gvSubCategories_SelectedIndexChanged(object sender, EventArgs e)
{
    BASubCategory baSubCat = new BASubCategory();
    Guid id = new Guid(gvSubCategories.SelectedDataKey.Value.ToString());
    SubCategory subCat = baSubCat.GetSubCategory(id);

    txtName.Text = subCat.Name;
    imgImage.ImageUrl = subCat.ImageURL;
}

GridView 定义

<div class="content">

    <asp:GridView ID="gvSubCategories" runat="server" DataKeyNames="ID" AutoGenerateColumns="false"
        onrowdatabound="gvSubCategories_RowDataBound" 
        onselectedindexchanged="gvSubCategories_SelectedIndexChanged">
        <Columns>
            <asp:CommandField ShowSelectButton="true" />
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:Image ID="imgSubCategory" runat="server" Width="100px" Height="100px" />
                </ItemTemplate>
            </asp:TemplateField>
            <asp:BoundField DataField="CategoryName" HeaderText="Category Name" />
            <asp:BoundField DataField="SubCategoryName" HeaderText="Sub Category Name" />
            <asp:BoundField DataField="SubCategoryImage" HeaderText="Sub Category Image" />
        </Columns>
    </asp:GridView>

</div>

【问题讨论】:

  • 您是否尝试过将列表拆分为自己的对象,然后进行数据绑定?这也将允许您检查其上的 COUNT 并确保您确实拥有您期望的记录
  • @JimBeam 是的,我以前做过。我确实得到了记录。我刚刚尝试注释掉onRowDataBound() 并显示所有记录。

标签: c# asp.net gridview


【解决方案1】:

我自己解决了这个问题。

由于声明了GridViewRowDataBound 事件,并且我的每行对象由两个不同的Entities(子类别和类别)组成,因此在

       SubCategory currentSubCat = (SubCategory)e.Row.DataItem;

提到的事件。它无法将 Anonymous 对象(由 SubCategory 和 Category 组成)转换为 SubCategory,从而引发异常。这导致GridView 在放置第一个元素后停止执行RowDataBound,因此只显示第一个元素。

我不得不删除上面的行,一切正常。

【讨论】:

    【解决方案2】:

    只是为了解决这个问题。我有一个 gridview 列,看起来像这样:

    <asp:BoundField DataField="DueDate" HeaderText="DueDate" SortExpression="DueDate">
      <ItemStyle Wrap="False" />
    </asp:BoundField>

    我的网格是调用存储过程背后的代码中的字段,在这里也看不到太多。 c#的结尾是这样的

    gv_maingrid2.DataSource = dt
    gv_maingrid2.DataBind()
    

    问题是我的存储过程没有返回 DueDate 列的列标题。当我在 SSMS 中运行存储过程时,DueDate 列值显示“(无列名)”,因为我将该值转换为 varchar 并且从未添加别名或列名。检查您是否获得了所有列标题。我希望这对某人有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-05
      • 1970-01-01
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多