选定的索引已更改在已填充的网格视图上返回空值

时间:2016-04-23 10:52:27

标签: c# asp.net visual-studio gridview

我有一个函数可以检查需要执行哪个sql查询并返回一个DataTable,它被称为searchData并且位于CarsDataSet类中

DataTable dataTable = null; //before there is code to detect the sql command to execute
    if (sqlCommand != null)
    {
        SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(sqlCommand, con);
        dataTable = new DataTable();
        sqlDataAdapter.Fill(dataTable);
    }

    return dataTable;

我正在使用aspx.cs页面上的这个函数,以便将这个DataTable绑定到GridView ..

GridViewCarsFiltered.DataSource = carsDataSet.searchData(type, manufacturer, maxPrice, minPrice, maxYear, minYear);
GridViewCarsFiltered.DataBind();

GridView会正常填充,但是当尝试使用select索引更改处理程序来获取行的值时会出现问题。

protected void GridViewCarsFiltered_SelectedIndexChanged(object sender, EventArgs e)
{    
    string carId = GridViewCarsFiltered.SelectedRow.Cells[1].Text;
}

我收到'ArgumentOutOfRangeException',说carId为空。

这是我的GridView,DataSourceID为null,因为我从后面的代码设置..

<asp:GridView ID="GridViewCarsFiltered" runat="server" CssClass="table table-striped table-hover" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" BackColor="#CCCCCC" BorderColor="#999999" BorderStyle="Solid" BorderWidth="3px" CellPadding="4" CellSpacing="2" DataSourceID="" ForeColor="Black" OnSelectedIndexChanged="GridViewCarsFiltered_SelectedIndexChanged" DataKeyNames="Id">
    <Columns>
        <asp:CommandField ShowSelectButton="True" />
        <asp:BoundField DataField="Id" HeaderText="Id" InsertVisible="False" ReadOnly="True" SortExpression="Id" />
        <asp:BoundField DataField="type" HeaderText="type" SortExpression="type" />
        <asp:BoundField DataField="manufacturer" HeaderText="manufacturer" SortExpression="manufacturer" />
        <asp:BoundField DataField="model " HeaderText="model " SortExpression="model " />
        <asp:BoundField DataField="colour" HeaderText="colour" SortExpression="colour" />
        <asp:BoundField DataField="price" HeaderText="price" SortExpression="price" />
        <asp:BoundField DataField="year" HeaderText="year" SortExpression="year" />
        <asp:BoundField DataField="location" HeaderText="location" SortExpression="location" />
        <asp:BoundField DataField="username" HeaderText="username" SortExpression="username" />
    </Columns>
</asp:GridView>

这是实际填充的GridView的截图

enter image description here

我希望我已经足够清楚了,你们中的一些人可以帮助我...... 提前谢谢

1 个答案:

答案 0 :(得分:0)

在这种情况下检索值的首选方法是使用DataKeyNames而不是从单元格本身获取值。此方法还可用于从未显示在GridView列中的字段中获取值。

您可以在标记中将Id字段添加到该属性:

<asp:GridView ID="gv" runat="server" DataKeyNames="Id" ... >

以这种方式检索代码隐藏中的值:

protected void gv_SelectedIndexChanged(object sender, EventArgs e)
{    
    int carId = (int)gv.DataKeys[gv.SelectedRow.RowIndex].Values["Id"];
}

注意:我仅使用gv代替GridViewCarsFiltered来减少代码示例的宽度。


更新

另一方面,如果在选择行后GridView为空,则问题可能是ViewState被禁用(在页面级别或在Web.config中)。启用它应该可以解决问题。