更改DataGrid中显示字段的顺序

时间:2017-01-19 17:51:41

标签: c# asp.net datagrid code-behind

我搜索了这个,答案似乎没有用。我在C#代码隐藏中获得了以下功能:

public void Show_Data2(string LPI_ID)
{
    OracleConnection conn = GetConnection();
    try
    {
        {
            //conn.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnCST"].ToString();

            OracleCommand cmd3 = new OracleCommand();
            cmd3.CommandType = CommandType.StoredProcedure;
            cmd3.CommandText = "SP_LPI_REGISTER_CLAIM_DETAILS";
            cmd3.Connection = conn;

            cmd3.Parameters.Add("vLPI_ID", OracleType.VarChar, 20).Value = LPI_ID;
            cmd3.Parameters.Add("vClaimDetails", OracleType.Cursor).Direction = ParameterDirection.Output;

            //connection2.Open();

            var SearchAdapter = new OracleDataAdapter(cmd3);
            var ds = new DataSet();
            SearchAdapter.Fill(ds);

            DataGrid_ClaimDetail.DataSource = ds;
            DataGrid_ClaimDetail.DataBind();

            // The problem happens here:
            DataGrid_ClaimDetail.Columns["Item"].DisplayIndex = 0;
            DataGrid_ClaimDetail.Columns["dt"].DisplayIndex = 1;
            DataGrid_ClaimDetail.Columns["UserName"].DisplayIndex = 2;

            if (DataGrid_ClaimDetail.Items.Count < 1)
            {
                lblEmpty2.Visible = true;
                lblEmpty2.Text = "There is no data to display";
            }
            else
            {
                lblEmpty2.Visible = false;
            }

            conn.Close();
        }
    }
    catch (Exception ex)
    {
        Response.Write(ex.Message);
        conn.Close();
    }
}

我在asp.net中有以下DataGrid:

<div id="divGrid2" style='width:920px; height:230px; overflow:auto;'>
        <asp:DataGrid ID="DataGrid_ClaimDetail" runat="server" Visible="true"
AllowPaging="True" AllowSorting="True" CellPadding="4" ForeColor="#333333" GridLines="None" AutoGenerateColumns="true"
OnCancelCommand="DataGrid_ClaimDetail_CancelCommand" 
OnUpdateCommand="DataGrid_ClaimDetail_UpdateCommand" 
OnEditCommand="DataGrid_ClaimDetail_EditCommand">
                <AlternatingItemStyle Font-Bold="False" Font-Italic="False" 
                Font-Overline="False" Font-Strikeout="False" Font-Underline="False" />
        <EditItemStyle BackColor="#999999" Font-Bold="False" Font-Italic="False" 
                Font-Overline="False" Font-Strikeout="False" Font-Underline="False" />
        <FooterStyle BackColor="#5D7B9D" Font-Bold="False" Font-Italic="False" 
                Font-Overline="False" Font-Strikeout="False" Font-Underline="False" />
        <HeaderStyle BackColor="#5D7B9D" Font-Bold="False" Font-Italic="False" 
                Font-Overline="False" Font-Strikeout="False" Font-Underline="False" />
        <PagerStyle BackColor="#5D7B9D" Font-Bold="False" Font-Italic="False" 
                Font-Overline="False" Font-Strikeout="False" Font-Underline="False" />
        <SelectedItemStyle BackColor="#E2DED6" Font-Bold="False" Font-Italic="False" 
                Font-Overline="False" Font-Strikeout="False" Font-Underline="False" />
        <Columns>
                <asp:EditCommandColumn ButtonType="PushButton" CancelText="Cancel" 
                        EditText="Select" UpdateText="Update"></asp:EditCommandColumn>
        </Columns>

        </asp:DataGrid>
        <asp:Label ID="lblEmpty2" runat="server" Visible="false" Style="font-weight:bold; font-size:large;"></asp:Label>
</div> 

如果我在C#代码中取出3个DisplayIndex行,它可以正常工作,但我的字段不是我喜欢的顺序。

如果我重新放入这些行,我会在每行代码上出错:

  

无法转换为&#39; string&#39;到&#39; int&#39;

并且每个字段名称都带有下划线。

任何人都可以看到我可能做错了什么,或者告诉我如何能够重新排序GridView中的字段?

2 个答案:

答案 0 :(得分:0)

DataGrid.Columns collection只有this[Int32]索引器,因此您无法按名称(cannot convert from 'string' to 'int')访问其项目。要使用它,您必须知道所需的索引:

DataGrid_ClaimDetail.Columns[3].DisplayIndex = 0;

那你怎么用他们的名字得到专栏?

DataGridColumn上似乎没有Name属性,但您可以尝试使用每列的HeaderText属性,标准数据绑定方案中的属性应该等于原始属性数据库列名:

var columns = DataGrid_ClaimDetail
    .Columns
    .Cast<DataGridColumn>()
    .Where(col => // Not sure but some button columns may be headerless
        !String.IsNullOrEmpty(col.HeaderText))
    .ToDictionary(
        keySelector: col => col.HeaderText,
        comparer: StringComparer.OrdinalIgnoreCase);

columns["Item"].DisplayIndex = 0;

或者您可以尝试使用BoundColumn.DataField

var columns = DataGrid_ClaimDetail
    .Columns
    .OfType<BoundColumn>()
    .ToDictionary((
        keySelector: col => col.DataField,
        comparer: StringComparer.OrdinalIgnoreCase);

答案 1 :(得分:0)

经过一些反复试验,我找到了解决方案。

我做的第一件事是从DataSet更改为DataTable。这允许我使用SetOrdinal属性。它还允许我在代码隐藏中使用Visible属性。

var SearchAdapter = new OracleDataAdapter(cmd3);
var ds = new DataTable();
SearchAdapter.Fill(ds);

ds.Columns[0].SetOrdinal(1);
ds.Columns[1].SetOrdinal(2);
ds.Columns[2].SetOrdinal(3);

DataGrid_ClaimDetail.DataSource = ds;
DataGrid_ClaimDetail.DataBind();

DataGrid_ClaimDetail.Columns[4].Visible = false;

为了做到这一点,我不得不将ASP端的AutoGenerateColumns更改为&#34; false&#34;。然后,我在<Columns>标记中对列名进行了硬编码:

<Columns>
    <asp:EditCommandColumn ButtonType="PushButton" CancelText="Cancel" 
         EditText="Select" UpdateText="Update"></asp:EditCommandColumn>

    <asp:BoundColumn HeaderText="Status" DataField="Item" />
    <asp:BoundColumn HeaderText="Date" DataField="dt" />
    <asp:BoundColumn HeaderText="Who" DataField="UserName" />
    <asp:BoundColumn HeaderText="UserID" DataField="UserID" ItemStyle-Width="0px" />

</Columns>

通过更改列的Visible属性,它仍允许我访问UserID字段中存储的值(在EditCommandColumn中创建的按钮的OnClick事件中使用它)。

不像我希望的那样完全,但它完成了工作。