【问题标题】:Changing order of display fields in a DataGrid更改 DataGrid 中显示字段的顺序
【发布时间】:2017-01-19 17:51:40
【问题描述】:

我已经搜索过这个,但答案似乎不起作用。我在 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 行,它可以正常工作,但我的字段不是我想要的顺序。

如果我把这些行放回去,每行代码都会出错:

无法从“字符串”转换为“整数”

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

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

【问题讨论】:

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


    【解决方案1】:

    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);
    

    【讨论】:

    • 关于第一部分; “DataGridColumn”不包含“DisplayIndex”的定义,并且找不到接受“DataGridColumn”类型的第一个参数的扩展方法“DisplayIndex”(您是否缺少 using 指令或程序集引用?)
    • @JohnyBones 嗯,假设存在此类属性,我实际上并没有检查代码。在这种情况下,您可能必须通过从Columns 集合中删除/添加列来手动重新排序列。当我有时间时,我会尝试制作一个可以工作的原型,可能是明天。
    • 经过一番谷歌搜索,似乎这只适用于 Windows.Forms,而我在 Intranet 网站上使用它?
    【解决方案2】:

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

    我做的第一件事是从 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 更改为“false”。然后我硬编码&lt;Columns&gt;标签中的列名:

    <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 事件中使用)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-20
      • 2022-01-03
      • 2019-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多