关于propertygrid

liangchencf 2009-11-19 10:09:58
实例中有一个属性是enum类型,能不能在设计时实现复选功能,结果是枚举值的逻辑“或”关系。
...全文
49 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
noway8881 2009-11-19
  • 打赏
  • 举报
回复
可以

不过你要自己实现它的设计类,我举个简单的例子给你。weifenluo.DockPanel

[Flags]
[Serializable]
[Editor(typeof(DockAreasEditor), typeof(System.Drawing.Design.UITypeEditor))]
public enum DockAreas
{
Float = 1,
DockLeft = 2,
DockRight = 4,
DockTop = 8,
DockBottom = 16,
Document = 32
}

[LocalizedCategory("Category_Docking")]
[LocalizedDescription("DockContent_DockAreas_Description")] [DefaultValue(DockAreas.DockLeft|DockAreas.DockRight|DockAreas.DockTop|DockAreas.DockBottom|DockAreas.Document|DockAreas.Float)]
public DockAreas DockAreas
{
get { return DockHandler.DockAreas; }
set { DockHandler.DockAreas = value; }
}

设计器代码
using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Design;
using System.Windows.Forms;
using System.Windows.Forms.Design;

namespace WeifenLuo.WinFormsUI.Docking
{
internal class DockAreasEditor : UITypeEditor
{
private class DockAreasEditorControl : System.Windows.Forms.UserControl
{
private CheckBox checkBoxFloat;
private CheckBox checkBoxDockLeft;
private CheckBox checkBoxDockRight;
private CheckBox checkBoxDockTop;
private CheckBox checkBoxDockBottom;
private CheckBox checkBoxDockFill;
private DockAreas m_oldDockAreas;

public DockAreas DockAreas
{
get
{
DockAreas dockAreas = 0;
if (checkBoxFloat.Checked)
dockAreas |= DockAreas.Float;
if (checkBoxDockLeft.Checked)
dockAreas |= DockAreas.DockLeft;
if (checkBoxDockRight.Checked)
dockAreas |= DockAreas.DockRight;
if (checkBoxDockTop.Checked)
dockAreas |= DockAreas.DockTop;
if (checkBoxDockBottom.Checked)
dockAreas |= DockAreas.DockBottom;
if (checkBoxDockFill.Checked)
dockAreas |= DockAreas.Document;

if (dockAreas == 0)
return m_oldDockAreas;
else
return dockAreas;
}
}

public DockAreasEditorControl()
{
checkBoxFloat = new CheckBox();
checkBoxDockLeft = new CheckBox();
checkBoxDockRight = new CheckBox();
checkBoxDockTop = new CheckBox();
checkBoxDockBottom = new CheckBox();
checkBoxDockFill = new CheckBox();

SuspendLayout();

checkBoxFloat.Appearance = Appearance.Button;
checkBoxFloat.Dock = DockStyle.Top;
checkBoxFloat.Height = 24;
checkBoxFloat.Text = Strings.DockAreaEditor_FloatCheckBoxText;
checkBoxFloat.TextAlign = ContentAlignment.MiddleCenter;
checkBoxFloat.FlatStyle = FlatStyle.System;

checkBoxDockLeft.Appearance = System.Windows.Forms.Appearance.Button;
checkBoxDockLeft.Dock = System.Windows.Forms.DockStyle.Left;
checkBoxDockLeft.Width = 24;
checkBoxDockLeft.FlatStyle = FlatStyle.System;

checkBoxDockRight.Appearance = System.Windows.Forms.Appearance.Button;
checkBoxDockRight.Dock = System.Windows.Forms.DockStyle.Right;
checkBoxDockRight.Width = 24;
checkBoxDockRight.FlatStyle = FlatStyle.System;

checkBoxDockTop.Appearance = System.Windows.Forms.Appearance.Button;
checkBoxDockTop.Dock = System.Windows.Forms.DockStyle.Top;
checkBoxDockTop.Height = 24;
checkBoxDockTop.FlatStyle = FlatStyle.System;

checkBoxDockBottom.Appearance = System.Windows.Forms.Appearance.Button;
checkBoxDockBottom.Dock = System.Windows.Forms.DockStyle.Bottom;
checkBoxDockBottom.Height = 24;
checkBoxDockBottom.FlatStyle = FlatStyle.System;

checkBoxDockFill.Appearance = System.Windows.Forms.Appearance.Button;
checkBoxDockFill.Dock = System.Windows.Forms.DockStyle.Fill;
checkBoxDockFill.FlatStyle = FlatStyle.System;

this.Controls.AddRange(new Control[] {
checkBoxDockFill,
checkBoxDockBottom,
checkBoxDockTop,
checkBoxDockRight,
checkBoxDockLeft,
checkBoxFloat});

Size = new System.Drawing.Size(160, 144);
BackColor = SystemColors.Control;
ResumeLayout();
}

public void SetStates(DockAreas dockAreas)
{
m_oldDockAreas = dockAreas;
if ((dockAreas & DockAreas.DockLeft) != 0)
checkBoxDockLeft.Checked = true;
if ((dockAreas & DockAreas.DockRight) != 0)
checkBoxDockRight.Checked = true;
if ((dockAreas & DockAreas.DockTop) != 0)
checkBoxDockTop.Checked = true;
if ((dockAreas & DockAreas.DockTop) != 0)
checkBoxDockTop.Checked = true;
if ((dockAreas & DockAreas.DockBottom) != 0)
checkBoxDockBottom.Checked = true;
if ((dockAreas & DockAreas.Document) != 0)
checkBoxDockFill.Checked = true;
if ((dockAreas & DockAreas.Float) != 0)
checkBoxFloat.Checked = true;
}
}

private DockAreasEditor.DockAreasEditorControl m_ui = null;

public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.DropDown;
}

public override object EditValue(ITypeDescriptorContext context, IServiceProvider sp, object value)
{
if (m_ui == null)
m_ui = new DockAreasEditor.DockAreasEditorControl();

m_ui.SetStates((DockAreas)value);

IWindowsFormsEditorService edSvc = (IWindowsFormsEditorService)sp.GetService(typeof(IWindowsFormsEditorService));
edSvc.DropDownControl(m_ui);

return m_ui.DockAreas;
}
}
}



liangchencf 2009-11-19
  • 打赏
  • 举报
回复
没有人知道么
liangchencf 2009-11-19
  • 打赏
  • 举报
回复
恩,看来只有这样了,我主要是不像写那么多代码在,以为有个属性可以设置一下。。。

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧