c# windows 窗体 如何 设置菜单的权限
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c# windows 窗体 如何 设置菜单的权限相关的知识,希望对你有一定的参考价值。
从数据库中获取字段,并显示
我的菜单项是固定的,所以只要设置是否显示就可以了,那如果管理员要给普通员工加一些全新,是不是要把所有的菜单项都列出来,一个个设置?
绑定的对应菜单的 visible 属性
如何将 datetimepicker 下拉菜单设置为仅显示月份
【中文标题】如何将 datetimepicker 下拉菜单设置为仅显示月份【英文标题】:How can I set the datetimepicker dropdown to show Months only 【发布时间】:2016-01-18 02:36:55 【问题描述】:所以不是在点击下拉菜单时显示。
我希望单击时下拉菜单是这样的。
非常感谢您的帮助。 :)
【问题讨论】:
抱歉。忘了提。它在窗户上。 Windows 窗体还是 Windows WPF?我假设 Windows = Windows 窗体。 是的。它是窗体。 ***.com/a/5271042/17034 【参考方案1】:使用windows messages approach,您可以检测月历控件显示并强制月视图,并且您可以检测视图更改并在月视图更改时关闭月历控件(选择一个月后)。
实现它的最简单方法是覆盖 DateTimePicker。
public class MonthPicker : DateTimePicker
// initialize Format/CustomFormat to display only month and year.
public MonthPicker()
Format = DateTimePickerFormat.Custom;
CustomFormat = "MMMM yyyy";
// override Format to redefine default value (used by designer)
[DefaultValue(DateTimePickerFormat.Custom)]
public new DateTimePickerFormat Format
get => base.Format;
set => base.Format = value;
// override CustomFormat to redefine default value (used by designer)
[DefaultValue("MMM yyyy")]
public new string CustomFormat
get => base.CustomFormat;
set => base.CustomFormat = value;
protected override void WndProc(ref Message m)
if (m.Msg == WM_NOFITY)
var nmhdr = (NMHDR)Marshal.PtrToStructure(m.LParam, typeof(NMHDR));
switch (nmhdr.code)
// detect pop-up display and switch view to month selection
case -950:
var cal = SendMessage(Handle, DTM_GETMONTHCAL, IntPtr.Zero, IntPtr.Zero);
SendMessage(cal, MCM_SETCURRENTVIEW, IntPtr.Zero, (IntPtr)1);
break;
// detect month selection and close the pop-up
case MCN_VIEWCHANGE:
var nmviewchange = (NMVIEWCHANGE)Marshal.PtrToStructure(m.LParam, typeof(NMVIEWCHANGE));
if (nmviewchange.dwOldView == 1 && nmviewchange.dwNewView == 0)
SendMessage(Handle, DTM_CLOSEMONTHCAL, IntPtr.Zero, IntPtr.Zero);
break;
base.WndProc(ref m);
private const int WM_NOFITY = 0x004e;
private const int DTM_CLOSEMONTHCAL = 0x1000 + 13;
private const int DTM_GETMONTHCAL = 0x1000 + 8;
private const int MCM_SETCURRENTVIEW = 0x1000 + 32;
private const int MCN_VIEWCHANGE = -750;
[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
[StructLayout(LayoutKind.Sequential)]
private struct NMHDR
public IntPtr hwndFrom;
public IntPtr idFrom;
public int code;
[StructLayout(LayoutKind.Sequential)]
struct NMVIEWCHANGE
public NMHDR nmhdr;
public uint dwOldView;
public uint dwNewView;
【讨论】:
@ZulqarnainJalil 你能提供更多信息和背景吗?什么没有奏效 ?你用的是什么平台?等等…… 我在 Visualstudio 2017 上使用 C# windows 窗体应用程序。我已将您的代码复制到我的 form1.cs 类中,我在 form1 中添加的日历控件没有任何反应 这不是它的工作方式。这是一个自定义用户控件。尝试获取有关此主题的信息。 当然...我会尝试:) @ZulqarnainJalil,将代码放在单独的 MonthPicker.cs 文件中。编译。打开 Form1 设计器。该控件将出现在“AppName Components”部分的工具箱窗口中,并命名为“MonthPicker”。将其作为新组件添加到主窗体中。等等。【参考方案2】:为什么需要这样做?如果您只想显示月份,那么更简单的方法是在 Combox 中列出月份。
不过,我在 msdn 上为您找到了一些东西。看看这里https://social.msdn.microsoft.com/Forums/en-US/7bdca56f-719e-44bf-be6d-a9600dfa8f78/wpf-datepicker-for-months-only?forum=wpf
【讨论】:
因为我只需要用户选择月份并且不想误导他们认为日期也应该是准确的,因此唯一重要的是月份。 @Bigboss ComboBox 中的月份列表是您需要的标准解决方案。 @JeremyThompson,但是如果我想要一年呢? @Bigboss 您是否有机会查看链接。这里只是简单的解释,它讨论了 WPF Toolkit 中的日历控件,它确实有三个 DisplayModes。一个是十年,可能适合您的需求。附言我还没有尝试过,但我想这值得尝试。否则再次使用 Combox。【参考方案3】:试试下面的代码:
DateTime newDateValue = new DateTime(dateTimePicker_month.Value.Year, 1, 1);
dateTimePicker_month.Value = newDateValue;
dateTimePicker_month.Format = DateTimePickerFormat.Custom;
dateTimePicker_month.CustomFormat = "MMM-yyyy";
dateTimePicker_month.ShowUpDown = true;
您必须为 28/29 天的 2 月添加 (1,1) 以确定所有月份的值。如果您希望查询选择月份。以下是一个示例:
string month = dateTimePicker_month.Value.Month.ToString();
string year = dateTimePicker_month.Value.Year.ToString();
使用以下查询选择月份:
select CAST(date AS DATE) from table where DATEPART(month, date) = '" + month + "' and DATEPART(year,date) = '" + year + "'
【讨论】:
【参考方案4】:由于在我的情况下不起作用,我修改了 Orance 的答案,将其放在继承自 DateTimePicker 的类中:
protected override void WndProc(ref Message m)
if (_MonthSelectStyle)
if (m.Msg == 0X204E) // = Win32Messages.WM_REFLECT_NOTIFY
var nmhdrI = (NMHDR)(Marshal.PtrToStructure(m.LParam, typeof(NMHDR)));
switch (nmhdrI.code)
case -754: // Win32Messages.DTN_DROPDOWN
var cal = SendMessage(m.HWnd, WinApi.Win32Messages.DTM_GETMONTHCAL, IntPtr.Zero, IntPtr.Zero);
SendMessage(cal, WinApi.Win32Messages.MCM_SETCURRENTVIEW, IntPtr.Zero, (IntPtr)1);
break;
case -759: // Win32Messages.DTN_DATETIMECHANGE
WinApi.SendMessage(Handle, WinApi.Win32Messages.DTM_CLOSEMONTHCAL, IntPtr.Zero, IntPtr.Zero);
break;
base.WndProc(ref m);
和 VB 等价物:
Protected Overrides Sub WndProc(ByRef m As Message)
If _MonthSelectStyle Then
If m.Msg = &H204E Then ' WM_REFLECT_NOTIFY '&H204E
Dim nmhdrI = CType(Marshal.PtrToStructure(m.LParam, GetType(NMHDR)), NMHDR)
Select Case nmhdrI.code
Case -754 ' Win32Messages.DTN_DROPDOWN '-754
Dim cal = SendMessage(m.HWnd, WinApi.Win32Messages.DTM_GETMONTHCAL, IntPtr.Zero, IntPtr.Zero)
SendMessage(cal, WinApi.Win32Messages.MCM_SETCURRENTVIEW, IntPtr.Zero, CType(1, IntPtr))
Case -759 ' Win32Messages.DTN_DATETIMECHANGE '-759
WinApi.SendMessage(Handle, WinApi.Win32Messages.DTM_CLOSEMONTHCAL, IntPtr.Zero, IntPtr.Zero)
End Select
End If
End If
MyBase.WndProc(m)
End Sub
【讨论】:
【参考方案5】:尝试使用格式属性:
dateTimePicker.Format = DateTimePickerFormat.Custom;
dateTimePicker.CustomFormat = "MM";
【讨论】:
已经试过了。唯一改变的是显示,但是当单击下拉菜单时。它仍然显示日子。 查看我的更新答案。如果您想显示没有日期的日历,我认为您需要将 DatePicker 替换为 MonthCalendar。 我已阅读您的编辑,但我应该在 MonthCalendar 类中更改哪些选项。我相信这个类是 datetimepicker 单击下拉菜单时使用的类。 我找到了这个解决方案:netprogrammingodyssey.wordpress.com/2010/11/14/…,但是您需要将 silverlight 添加到您的项目中来实现它。以上是关于c# windows 窗体 如何 设置菜单的权限的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Windows 窗体 C# 中为文本框设置 Scintilla