当列设置为不可见时,asp.net gridview控件单元格引用值不起作用

时间:2016-12-08 15:07:54

标签: c# asp.net gridview

我有一个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,因此我得到错误“输入字符串格式不正确”。

问题是如何检索列值并使列不可见?

3 个答案:

答案 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

从选定的GridView行中获取所需的字段
    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">

我测试了它,它保存了所有列值并隐藏了列。