在Windows主机的TreeView窗体DataGridView细胞 [英] Host TreeView in Windows Forms DataGridView Cells

查看:91
本文介绍了在Windows主机的TreeView窗体DataGridView细胞的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想创建一个DataGridView一个TreeView列。我已经遵循了 rel=\"nofollow\">的例子通过如下扩展的TreeView

I want to create a TreeView column for a DataGridView. I have followed the example in here by extending the TreeView as below.

public class TreeViewEditingControl : TreeView, IDataGridViewEditingControl

public class TreeViewCell : DataGridViewComboBoxCell // Not sure whether this should be DataGridViewTextBoxCell

这是我的问题。我可以看到在树视图细胞,但我不知道如何提高细胞/ TreeView的高度时,对小区内的用户点击(如组合框扩展)。有没有人有这个什么想法?

This is my issue. I can see the Treeview in cells, but I don't know how to increase the height of the Cell/TreeView when user click on a cell (as ComboBox expands). Does anyone have any idea on this?

推荐答案

我会催生一个新的无边框形式,里面停靠TREECTRL,我已经做了这与CalendarControl和它工作得很好。用户将不知道的差如果设置形式的左上角到正在编辑的单元格的左上角。 。希望这是你在找什么。

I would spawn a new borderless form with a TreeCtrl Docked inside, I've done this with a CalendarControl and it works well. The user will not know the difference if you set the upper left hand corner of the form to the upper left hand corner of the cell that is being edited. Hope this is what you are looking for.

编辑:

下面是实现我做了一个文件选择单元格。它出现在单元格当你点击它进行编辑浏览按钮,它会打开一个FileOpenDialog。该代码是漫长的,但我认为你可以挑选出你需要实现的部分。

Here is an implementation I did for a File Selection Cell. It has a Browse button that appears in the cell when you click it for editing and it opens a FileOpenDialog. The code is lengthy, but I think you can pick out the parts you need to implement.

public class DataGridViewFileColumn : DataGridViewColumn
{
    public DataGridViewFileColumn() : base(new DataGridViewFileCell())
    {
        BrowseLabel = "...";
        SaveFullPath = false;
    }

    public override DataGridViewCell CellTemplate
    {
        get
        {
            return base.CellTemplate;
        }
        set
        {
            // Ensure that the cell used for the template is a DataGridViewFileCell.
            if (value != null &&
                !value.GetType().IsAssignableFrom(typeof(DataGridViewFileCell)))
            {
                throw new InvalidCastException("Must be a DataGridViewFileCell");
            }
            base.CellTemplate = value;
        }
    }

    [Description("Label to place on Browse button"),Category("Appearance")]
    [DefaultValue("...")]
    public string BrowseLabel 
    {
        get; 
        set; 
    }

    [Description("Save full path name"), Category("Behavior")]
    [DefaultValue(true)]
    public bool SaveFullPath
    {
        get;
        set;
    }
}


public class DataGridViewFileCell : DataGridViewTextBoxCell
{
    public DataGridViewFileCell() : base()
    {
    }

    public override void InitializeEditingControl(int rowIndex, object
            initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
    {
        // Set the value of the editing control to the current cell value.
        base.InitializeEditingControl(rowIndex, initialFormattedValue,
            dataGridViewCellStyle);
        FileEditingControl ctl = (FileEditingControl)DataGridView.EditingControl;
        // Use the default row value when Value property is null.
        if (this.Value == null)
        {
            ctl.Filename = this.DefaultNewRowValue.ToString();
        }
        else
        {
            ctl.Filename = this.Value.ToString();
        }
    }

    public override Type EditType
    {
        get
        {
            // Return the type of the editing control that DataGridViewFileCell uses.
            return typeof(FileEditingControl);
        }
    }

    public override Type ValueType
    {
        get
        {
            // Return the type of the value that DataGridViewFileCell contains.
            return typeof(string);
        }
    }
}

class FileEditingControl : FileTextBox, IDataGridViewEditingControl
{
    DataGridView dataGridView;
    private bool valueChanged = false;
    int rowIndex;

    public FileEditingControl()
    {
    }

    #region IDataGridViewEditingControl implementations
    public object EditingControlFormattedValue
    {
        get
        {
            return Filename;
        }
        set
        {
            if (value is String)
            {
                try
                {
                    Filename = (String)value;
                }
                catch
                {
                    Filename = value.ToString();
                }
            }
        }
    }

    public object GetEditingControlFormattedValue(
        DataGridViewDataErrorContexts context)
    {
        return EditingControlFormattedValue;
    }

    public void ApplyCellStyleToEditingControl(
        DataGridViewCellStyle dataGridViewCellStyle)
    {
        this.Font = dataGridViewCellStyle.Font;
    }

    public int EditingControlRowIndex
    {
        get
        {
            return rowIndex;
        }
        set
        {
            rowIndex = value;
        }
    }

    public bool EditingControlWantsInputKey(
        Keys key, bool dataGridViewWantsInputKey)
    {
        switch (key & Keys.KeyCode)
        {
            case Keys.Left:
            case Keys.Up:
            case Keys.Down:
            case Keys.Right:
            case Keys.Home:
            case Keys.End:
            case Keys.PageDown:
            case Keys.PageUp:
                return true;
            default:
                return !dataGridViewWantsInputKey;
        }
    }

    public void PrepareEditingControlForEdit(bool selectAll)
    {
    }

    public bool RepositionEditingControlOnValueChange
    {
        get
        {
            return false;
        }
    }

    public DataGridView EditingControlDataGridView
    {
        get
        {
            return dataGridView;
        }
        set
        {
            dataGridView = value;
        }
    }

    public bool EditingControlValueChanged
    {
        get
        {
            return valueChanged;
        }
        set
        {
            valueChanged = value;
        }
    }

    public Cursor EditingPanelCursor
    {
        get
        {
            return base.Cursor;
        }
    }
    #endregion

    protected override void OnValueChanged(FileEventArgs eventargs)
    {
        // Notify the DataGridView that the contents of the cell
        // have changed.
        valueChanged = true;
        this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
        base.OnValueChanged(eventargs);
    }
}

public partial class FileTextBox : UserControl
{

    #region Constructors
    public FileTextBox()
    {
        InitializeComponent();
        Tooltip = new ToolTip();

        SaveFullPath = false;
        AllowMultipleFiles = false;
        BrowseLabel = "...";
    }
    #endregion Constructors

    #region Properties
    /// <summary>
    /// Tooltip object used to show full path name
    /// </summary>
    private ToolTip Tooltip;

    /// <summary>
    /// Return the full path or just the filename?
    /// </summary>
    [Description("Save Full Path"), Category("Behavior")]
    [DefaultValue(false)]
    public bool SaveFullPath
    {
        get;
        set;
    }

    /// <summary>
    /// String representing the filename for this control
    /// </summary>
    public override string Text
    {
        get 
        { 
            return base.Text; 
        }
        set 
        {
            if (base.Text != value)
            {
                base.Text = value;
                Tooltip.SetToolTip(this, base.Text);
                Invalidate();
                OnValueChanged(new FileEventArgs(base.Text));
            }
        }
    }

    [Description("Browse Label"), Category("Appearance")]
    [DefaultValue("...")]
    public string BrowseLabel
    {
        get
        {
            return Browse.Text;
        }
        set
        {
            Browse.Text = value;
            Browse.Width = TextRenderer.MeasureText(Browse.Text, Browse.Font).Width + 8;
            Browse.Location = new Point(this.Width - Browse.Width, Browse.Location.Y);
        }
    }

    [Description("Allow Multiple Files"), Category("Behavior")]
    [DefaultValue(false)]
    public bool AllowMultipleFiles
    {
        get;
        set;
    }

    /// <summary>
    /// Selected filename (same as Text property)
    /// </summary>
    [Description("Filename"), Category("Data")]
    public string Filename
    {
        get { return Text; }
        set { Text = value; }
    }
    #endregion Properties

    #region Event Handlers
    /// <summary>
    /// Event raised when 
    /// </summary>
    public event EventHandler ValueChanged;
    protected virtual void OnValueChanged(FileEventArgs eventargs)
    {
        eventargs.Filename = Filename;
        if (this.ValueChanged != null)
            this.ValueChanged(this, eventargs);
    }

    private void Browse_Click(object sender, EventArgs e)
    {
        OpenFileDialog dlg = new OpenFileDialog();
        dlg.FileName = Text;

        dlg.Multiselect = AllowMultipleFiles;
        if (dlg.ShowDialog() == DialogResult.OK)
        {
            if (SaveFullPath)
                Text = dlg.FileName;
            else
                Text = dlg.SafeFileName;
        }
    } 

    protected override void OnPaint(PaintEventArgs e)
    {
        // Draw the client window
        Rectangle r = new Rectangle(new Point(0, 0), new Size(Size.Width-1, Size.Height-1));
        Graphics g = e.Graphics;
        g.FillRectangle(new SolidBrush(SystemColors.Window), r);
        g.DrawRectangle(new Pen(VisualStyleInformation.TextControlBorder), r);
        r.Y += Margin.Top;
        r.Width -= Browse.Width;

        // Fill with Text
        TextRenderer.DrawText(g, Text, Font, r, ForeColor, TextFormatFlags.PathEllipsis);

        base.OnPaint(e);
    }

    private void FileTextBox_DragDrop(object sender, DragEventArgs e)
    {
        DataObject data = (DataObject)e.Data;
        StringCollection filenames = data.GetFileDropList();

        if ( filenames.Count == 1)
            Text = filenames[0];
    }

    private void FileTextBox_DragEnter(object sender, DragEventArgs e)
    {
        DataObject data = (DataObject)e.Data;
        StringCollection filenames = data.GetFileDropList();

        if (/*!AllowMultipleFiles &&*/ filenames.Count == 1)
            e.Effect = DragDropEffects.Link;
    }
    #endregion Event Handlers

}

public class FileEventArgs : EventArgs
{
    public FileEventArgs(string Text)
    {
        Filename = Text;
    }

    /// <summary>
    /// Name of the file in the control
    /// </summary>
    public String Filename { get; set; }
}

这篇关于在Windows主机的TreeView窗体DataGridView细胞的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆