多选数据网格

Posted

技术标签:

【中文标题】多选数据网格【英文标题】:Multi-select DataGrid 【发布时间】:2013-04-07 09:58:29 【问题描述】:

我必须在 asp.net 中创建一个多选 DataGrid,为此我在 Code behind(C#) 中创建了一个类(MultiGrid)。

namespace Portal

public class MultiGrid : DataGrid

    // Constructor that sets some styles and graphical properties    
    public MultiGrid()
    
        AllowMultiSelect = false;
        AllowMultiSelectFooter = false;

        // Set event handlers
        Init += new EventHandler(OnInit);
        ItemCreated += new DataGridItemEventHandler(OnItemCreated);
    

    // PROPERTY: SelectedItems
    public ArrayList SelectedItems
    
        get
        
            if (!AllowMultiSelect) return null;

            ArrayList a = new ArrayList();
            foreach (DataGridItem dgi in Items)
            
                CheckBox cb = (CheckBox)dgi.Cells[0].Controls[0];
                if (cb.Checked)
                    a.Add(dgi);
            
            return a;
        
    

    // PROPERTY: AllowMultiSelect 
    public bool AllowMultiSelect = false;

    // PROPERTY: AllowMultiSelectFooter 
    public bool AllowMultiSelectFooter = false;

    // METHOD: ClearSelection
    public void ClearSelection()
    
        foreach (DataGridItem dgi in Items)
        
            CheckBox cb = (CheckBox)dgi.Cells[0].Controls[0];
            cb.Checked = false;
        
    

    ///////////////////////////////////////////////////////////////////
    // Event Handlers        // EVENT HANDLER: Init            
    private void OnInit(Object sender, EventArgs e)
    
        // Add a templated column that would allow for selection.
        // The item template contains a checkbox. It also features a 
        // templated footer containing links for Unselect/Select all 
        if (AllowMultiSelect)
            AddSelectColumn();
    

    // EVENT HANDLER: Deselect
    private void OnDeselect(Object sender, EventArgs e)
    
        ClearSelection();
    

    // EVENT HANDLER: ItemCreated            
    private void OnItemCreated(Object sender, DataGridItemEventArgs e)
    
        // Get the newly created item
        ListItemType itemType = e.Item.ItemType;

        ///////////////////////////////////////////////////////////////
        // FOOTER
        if (itemType == ListItemType.Footer && AllowMultiSelectFooter
            && AllowMultiSelect)
        
            // Look for a link button called "lnkSelect" in the context 
            // of the grid item that represents the footer
            LinkButton lb = (LinkButton)
                e.Item.FindControl("lnkDeselect");

            // Now you hold the living instance of the link 
            // button in the footer and can bind it to any code in the 
            // context of the MultiGrid control
            lb.Click += new EventHandler(OnDeselect);

            // Force ShowFooter to true
            ShowFooter = true;

            // Removes all the cells but the first 
            TableCell cell = e.Item.Cells[0];
            for (int i = 1; i < Columns.Count; i++)
            
                e.Item.Cells.RemoveAt(1);
            
            cell.ColumnSpan = Columns.Count;
        
    

    ///////////////////////////////////////////////////////////////////
    // Helper Functions

    private void AddSelectColumn()
    
        // Create the new templated column
        TemplateColumn tc = new TemplateColumn();
        tc.ItemStyle.BackColor = Color.SkyBlue;
        tc.ItemTemplate = new SelectColumnTemplate();
        tc.FooterTemplate = new SelectFooterTemplate();
        Columns.AddAt(0, tc);
    

///////////////////////////////////////////////////////////////////////
// Template Classes

public class SelectColumnTemplate : ITemplate

    public void InstantiateIn(Control container)
    
        CheckBox cb = new CheckBox();
        container.Controls.Add(cb);
    


public class SelectFooterTemplate : ITemplate

    public void InstantiateIn(Control container)
    
        LinkButton lb = new LinkButton();
        lb.Text = "Deselect all";
        lb.ID = "lnkDeselect";
        container.Controls.Add(lb);
    


问题:我需要在 aspx 文件中访问这个类,但它显示“元素“MultiGrid”不是已知元素”。我的 aspx 代码。

<%@ Register TagPrefix="expo" Namespace="Portal" Assembly="MultiGrid" %>
<expo:MultiGrid id="grid" runat="server" 
AutoGenerateColumns="false"
AllowMultiSelect="true"
AllowMultiSelectFooter="true"
font-size="x-small" font-names="verdana"
BorderStyle="solid" BorderWidth="1"
GridLines="both">

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

尝试重新构建您的解决方案,然后关闭 Visual Studio,然后再次打开以查看它是否有效。

如果没有,请尝试以下链接:

Resolving Validation Element

【讨论】:

它无法解决这个问题,仍然显示“元素“MultiGrid”不是已知元素”。

以上是关于多选数据网格的主要内容,如果未能解决你的问题,请参考以下文章

防止网格面板的键盘多选

平台网格部件删除选择行

度量快速开发平台网格勾选行(标识行),多选行获取方法

WPF DataGrid 多选绑定

ExtJS:EditorGrid 中的多选组合

如何防止单选按钮进行多选?