我有一个函数可以检查需要执行哪个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的截图
我希望我已经足够清楚了,你们中的一些人可以帮助我...... 提前谢谢
答案 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中)。启用它应该可以解决问题。