在Telerik RadGrid层次结构中隐藏一列

3
我在ASP .Net中使用Telerik RadGrid建立了一个层次结构,如下图所示。数据绑定是在运行时动态进行的。
我的要求是,我需要编程隐藏某些列,例如在第二级中的“OrderID”,在第三级中的“EmployeeID”和在第四级中的“OrderID”,但我需要这些值进行操作。您能帮助我实现这个功能吗? enter image description here

你需要在客户端还是服务器上使用这些值?你可以隐藏一列,但仍然可以在服务器上访问它。但如果你在讨论客户端,那就是另一回事了。 - Brian Mains
4个回答

2
请查看下方代码。
.aspx
 <telerik:RadGrid ID="RadGrid1" runat="server">
   </telerik:RadGrid>
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
        ConnectionString="<%$ ConnectionStrings:testDatabaseConnectionString %>" 
        SelectCommand="SELECT [CustomerID], [ContactName] FROM [Contacts]"></asp:SqlDataSource>
    <asp:SqlDataSource ID="SqlDataSource2" runat="server" 
        ConnectionString="<%$ ConnectionStrings:testDatabaseConnectionString %>" 
        SelectCommand="SELECT [CustomerID], [OrderID], [OrderDate] FROM [Orders] WHERE ([CustomerID] = @CustomerID)">
        <SelectParameters>
            <asp:Parameter Name="CustomerID" Type="Int32" />
        </SelectParameters>
    </asp:SqlDataSource>
    <asp:SqlDataSource ID="SqlDataSource3" runat="server" 
        ConnectionString="<%$ ConnectionStrings:testDatabaseConnectionString %>" 
        SelectCommand="SELECT [UnitPrice], [Quantity], [OrderID] FROM [ProductInfo] WHERE ([OrderID] = @OrderID)">
        <SelectParameters>
            <asp:Parameter Name="OrderID" Type="Int32" />
        </SelectParameters>
    </asp:SqlDataSource>

.aspx.cs

protected void Page_Init(object source, System.EventArgs e)
{
    DefineGridStructure();
}

private void DefineGridStructure()
{


    RadGrid1.ID = "RadGrid1";
    RadGrid1.DataSourceID = "SqlDataSource1";
    RadGrid1.AutoGenerateColumns = false;

    RadGrid1.MasterTableView.DataKeyNames = new string[] { "CustomerID" };

    RadGrid1.Width = Unit.Percentage(98);
    RadGrid1.PageSize = 3;
    RadGrid1.AllowPaging = true;
    RadGrid1.AllowSorting = true;
    RadGrid1.PagerStyle.Mode = GridPagerMode.NextPrevAndNumeric;
    RadGrid1.AutoGenerateColumns = false;
    RadGrid1.ShowStatusBar = true;

    RadGrid1.MasterTableView.PageSize = 3;

    //Add columns
    GridBoundColumn boundColumn;
    boundColumn = new GridBoundColumn();
    boundColumn.DataField = "CustomerID";
    boundColumn.HeaderText = "CustomerID";
    RadGrid1.MasterTableView.Columns.Add(boundColumn);

    boundColumn = new GridBoundColumn();
    boundColumn.DataField = "ContactName";
    boundColumn.UniqueName = "ContactName";
    boundColumn.HeaderText = "Contact Name";
    RadGrid1.MasterTableView.Columns.Add(boundColumn);


    //Detail table - Orders (II in hierarchy level)
    GridTableView tableViewOrders = new GridTableView(RadGrid1);
    tableViewOrders.Name = "Child1";
    tableViewOrders.DataSourceID = "SqlDataSource2";
    tableViewOrders.Width = Unit.Percentage(100);

    tableViewOrders.DataKeyNames = new string[] { "OrderID" };

    GridRelationFields relationFields = new GridRelationFields();
    relationFields.MasterKeyField = "CustomerID";
    relationFields.DetailKeyField = "CustomerID";
    tableViewOrders.ParentTableRelation.Add(relationFields);

    RadGrid1.MasterTableView.DetailTables.Add(tableViewOrders);

    //Add columns
    boundColumn = new GridBoundColumn();
    boundColumn.DataField = "OrderID";
    boundColumn.HeaderText = "OrderID";
    tableViewOrders.Columns.Add(boundColumn);

    boundColumn = new GridBoundColumn();
    boundColumn.DataField = "OrderDate";
    boundColumn.UniqueName = "OrderDate";
    boundColumn.HeaderText = "Date Ordered";
    tableViewOrders.Columns.Add(boundColumn);

    //Detail table Order-Details (III in hierarchy level)
    GridTableView tableViewOrderDetails = new GridTableView(RadGrid1);
    tableViewOrderDetails.Name = "Child2";
    tableViewOrderDetails.DataSourceID = "SqlDataSource3";
    tableViewOrderDetails.Width = Unit.Percentage(100);

    tableViewOrderDetails.DataKeyNames = new string[] { "OrderID" };

    GridRelationFields relationFields2 = new GridRelationFields();
    relationFields2.MasterKeyField = "OrderID";
    relationFields2.DetailKeyField = "OrderID";
    tableViewOrderDetails.ParentTableRelation.Add(relationFields2);

    tableViewOrders.DetailTables.Add(tableViewOrderDetails);

    boundColumn = new GridBoundColumn();
    boundColumn.DataField = "UnitPrice";
    boundColumn.HeaderText = "Unit Price";
    tableViewOrderDetails.Columns.Add(boundColumn);

    boundColumn = new GridBoundColumn();
    boundColumn.DataField = "Quantity";
    boundColumn.HeaderText = "Quantity";
    boundColumn.UniqueName = "Quantity";
    tableViewOrderDetails.Columns.Add(boundColumn);

    //Add the RadGrid instance to the controls
    RadGrid1.PreRender += new EventHandler(RadGrid1_PreRender);
    RadGrid1.DetailTableDataBind += new GridDetailTableDataBindEventHandler(RadGrid1_DetailTableDataBind);
}

void RadGrid1_DetailTableDataBind(object sender, GridDetailTableDataBindEventArgs e)
{
    if (e.DetailTableView.Name == "Child1")
    {
        foreach (GridColumn column in e.DetailTableView.Columns)
        {
            if (column.UniqueName == "OrderDate")
            {
                column.Visible = false;
            }
        }
    }

    if (e.DetailTableView.Name == "Child2")
    {
        foreach (GridColumn column in e.DetailTableView.Columns)
        {
            if (column.UniqueName == "Quantity")
            {
                column.Visible = false;
            }
        }
    }
}

void RadGrid1_PreRender(object sender, EventArgs e)
{

}

请查看上述代码中的“RadGrid1_DetailTableDataBind”事件。
如有疑问,请告诉我。

2

试一下这个:

GridBoundColumn a = new BoundColumn();
            a.Display = false;

或者

            a.Visible = false;

如果您想要访问该字段,请使用Display;否则请使用visible属性。


值得指出的是,将 Visible 属性设置为 false 实际上会从 GridColumnCollection 中删除特定列(在访问 Count 属性时不计算该列),而将 Display 属性设置为 false 会保留该列。 - Pawel Sledzikowski

1
Charan,如果你需要从列中获取特定的值进行计算,你应该尝试使用RadGrid的DataKeyNames和ClientDataKeyNames属性,而不是将值绑定到列然后隐藏列。这些属性可以在RadGrid以及MasterTableView中设置。
<MasterTableView DataKeyNames="id, orderId" ClientDataKeyNames="id, myId, type">

您可以在客户端和服务器端访问值:
(JS):
function RowSelected(sender,eventArgs)
{
var MasterTable = sender.get_masterTableView();
var row = MasterTable.get_dataItems()[eventArgs.get_itemIndexHierarchical()];
var myId = eventArgs.getDataKeyValue("myId");
}

0
你可以使用CSS来隐藏列。尝试访问单元格属性并将CSS附加到该单元格。在CSS中,您可以使内容显示为none。
希望这可以帮助到你。

@Not-RocketScience:在设计中,我只使用telerik:RadGrid</telerik:RadGrid>。它不包含任何列。所有的列和行都是在运行时创建的。因此,我们应该使用C#编程在运行时实现它。如果可能的话,您能否通过CSS来解释一下..? - Charan Raju C R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接