我有一个gridview1控件,我想在某些列中使用这些值,但我也想隐藏这些列,因为用户不需要看到它们,并且它们在显示中也占用了太多空间。但是,当我隐藏列并尝试使用列中的值时,我收到错误“输入字符串的格式不正确”。
//Here is the example of one column which I defined not visible:
<asp:GridView ID="GridView9" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource9" OnSelectedIndexChanged="GridView9_SelectedIndexChanged">
<Columns>
<asp:CommandField ShowSelectButton="True" />
<asp:BoundField DataField="WORKORDER_BASE_ID" HeaderText="WORKORDER_BASE_ID" SortExpression="WORKORDER_BASE_ID" />
<asp:BoundField DataField="WORKORDER_LOT_ID" HeaderText="WORKORDER_LOT_ID" SortExpression="WORKORDER_LOT_ID" Visible="False" />
<asp:BoundField DataField="WORKORDER_SPLIT_ID" HeaderText="WORKORDER_SPLIT_ID" SortExpression="WORKORDER_SPLIT_ID" Visible="False" />
<asp:BoundField DataField="WORKORDER_SUB_ID" HeaderText="WORKORDER_SUB_ID" SortExpression="WORKORDER_SUB_ID" Visible="False" />
<asp:BoundField DataField="SEQUENCE_NO" HeaderText="SEQUENCE_NO" SortExpression="SEQUENCE_NO" />
<asp:BoundField DataField="RESOURCE_ID" HeaderText="RESOURCE_ID" SortExpression="RESOURCE_ID" Visible="False" />
<asp:BoundField DataField="STATUS" HeaderText="STATUS" SortExpression="STATUS" Visible="False" />
<asp:BoundField DataField="RUN_COST_PER_HR" HeaderText="RUN_COST_PER_HR" SortExpression="RUN_COST_PER_HR" Visible="False"/>
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource9" runat="server" ConnectionString="<%$ ConnectionStrings:xyzConnectionString %>" SelectCommand="SELECT [WORKORDER_BASE_ID], [WORKORDER_LOT_ID], [WORKORDER_SPLIT_ID], [WORKORDER_SUB_ID], [SEQUENCE_NO], [RESOURCE_ID], [STATUS], [RUN_COST_PER_HR] FROM [OPERATION] WHERE (([STATUS] = @STATUS) AND ([RESOURCE_ID] = @RESOURCE_ID))">
<SelectParameters>
<asp:Parameter DefaultValue="R" Name="STATUS" Type="String" />
<asp:Parameter DefaultValue="XYZIBRA" Name="RESOURCE_ID" Type="String" />
</SelectParameters>
</asp:SqlDataSource>
// then later I do this:
vHOURLY_COST = Convert.ToDecimal(GridView9.SelectedRow.Cells[8].Text);
如果我删除Visible =“False”,则代码会成功执行。
我发现一旦我使列visible = false并且不可见的列的值变为NULL,因此我得到错误“输入字符串格式不正确”。
问题是如何检索列值并使列不可见?
答案 0 :(得分:0)
没有时间正确调查,但据我所知,如果你设置了Visible = False,那么asp控件根本不会呈现给页面。您可能正在尝试将空字符串转换为十进制。 也许您可以将原始数据集保留在Session变量中,或使用CSS隐藏不需要的列。
答案 1 :(得分:0)
根据您需要访问值的位置,有两种方法可以获取您不希望显示的值。
首先要做的事情。如果您的数据源提供了四个字段[A,B,C,D]并且您的Gridview绑定到两个字段[A,B]字段[C,D]仍然可以使用...取决于您需要它们的位置。< / p>
它们都在RowDataBound
事件中可用:
--I'm assuming you have some data source that provides the equivalent of
SELECT A,B,C,D from <your_table>
.aspx中的标记
<%-- Fields A, B will be visible in GridView1.
Fields C, D will be NOT visible in GridView1 but are available in the code behind.
--%>
<asp:GridView ID="GridView1" runat="server" OnRowDataBound="GridView1_RowDataBound">
<Columns>
<asp:BoundField DataField="A" HeaderText="Field A" />
<asp:BoundField DataField="B" HeaderText="Field B" />
</Columns>
</asp:GridView>
代码背后
protected void GridView1_RowDataBound( object sender, GridViewRowEventArgs e )
{
if ( e.Row.RowType == DataControlRowType.DataRow )
{
// How to access the undisplayed fields
DataRowView drv = (DataRowView) e.Row.DataItem;
String FieldC = drv["C"];
String FieldD = drv["D"];
// How to persist data for access elsewhere in the code behind.
// this will attach data to the <tr> tag in each data row
e.Row.Attributes["field-c"] = FieldC
e.Row.Attributes["field-d"] = FieldD
}
}
或者,如果您没有使用gridview中内置的编辑功能,则可以在gridview中将所需字段添加为数据键:
<asp:GridView ID="GridView1" runat="server" OnRowDataBound="GridView1_RowDataBound"
DataKeyNames="C,D">
. . .
</asp:GridView>
这将通过GridView1.SelectedDataKey
:
protected void btnSomeButton_Click( object sender, EventArgs e )
{
if( Gridview1.SelectedDataKey != null)
{
String FieldC = (String) GridView1.SelectedDataKey.Values[ "C" ];
String FieldD = (String) GridView1.SelectedDataKey.Values[ "D" ];
}
}
如果您计划使用gridview的内置编辑,则不建议使用DataKeyNames
属性,因为此属性适用于数据库主键。添加额外数据会使插入/更新/删除命令的自动化变得复杂。
答案 2 :(得分:0)
我发现了这个:
[ASP.NET: GridView value set to null when column is not visible
protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
{
e.Row.Cells[1].Visible = false;
e.Row.Cells[2].Visible = false;
}
但到目前为止,我还不知道如何实现GridView9_RowCreated事件。我将代码的第一行更改为:
<asp:GridView ID="GridView9" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource9" OnRowCreated="GridView9_RowCreated" OnSelectedIndexChanged="GridView9_SelectedIndexChanged">
我测试了它,它保存了所有列值并隐藏了列。