天道酬勤,学无止境

在WinForms应用程序中查找集中控件的首选方法是什么?(What is the preferred way to find focused control in WinForms app?)

问题

在WinForms中查找当前正在接收用户(键盘)输入的控件的首选/最简单方法是什么?

到目前为止,我已经提出了以下建议:

public static Control FindFocusedControl(Control control)
{
    var container = control as ContainerControl;
    return (null != container
        ? FindFocusedControl(container.ActiveControl)
        : control);
}

从表单中,可以简单地称为(在.NET 3.5及更高版本中,甚至可以将其定义为表单上的扩展方法)-

var focused = FindFocusedControl(this);

这样合适吗

有没有我应该使用的内置方法?

请注意,使用层次结构时,仅对ActiveControl的单个调用是不够的。 想象:

Form
    TableLayoutPanel
        FlowLayoutPanel
            TextBox (focused)

(formInstance).ActiveControl将返回对TableLayoutPanel的引用,而不是TextBox的引用(因为ActiveControl似乎只返回控件树中的直接活动子级,而我正在寻找叶子控件)。

回答1

如果您已经对Windows API进行了其他调用,那么使用Peters解决方案不会有任何危害。 但是我了解您对此的担心,并且倾向于仅使用Framework功能来实现与您类似的解决方案。 毕竟,性能差异(如果有的话)应该不大。

我将采用非递归方法:

public static Control FindFocusedControl(Control control)
{
    var container = control as IContainerControl;
    while (container != null)
    {
        control = container.ActiveControl;
        container = control as IContainerControl;
    }
    return control;
}
回答2

搜索互联网后,我在George Shepherd的Windows窗体常见问题解答中找到了以下内容

.Net框架库不提供用于查询重点控件的API。 您必须调用Windows API来执行此操作:

[C#]

public class MyForm : Form
{
          [DllImport("user32.dll", CharSet=CharSet.Auto, CallingConvention=CallingConvention.Winapi)]
          internal static extern IntPtr GetFocus();

          private Control GetFocusedControl()
          {
               Control focusedControl = null;
               // To get hold of the focused control:
               IntPtr focusedHandle = GetFocus();
               if(focusedHandle != IntPtr.Zero)
                    // Note that if the focused Control is not a .Net control, then this will return null.
                    focusedControl = Control.FromHandle(focusedHandle);
               return focusedControl;
          }
} 
回答3

窗体或容器上的ActiveControl返回该实体的活动控件,无论它嵌套在其他容器中的深度如何。

在您的示例中,如果TextBox具有Focus:则:对于Form,TableLayoutPanel和FlowLayoutPanel:所有这些控件的'ActiveControl属性将是TextBox!

一些但不是全部“真正的” ContainerControl类型……例如Form和UserControl……公开键事件(在Form的情况下:仅当Form.KeyPreview == true时才可以使用)。

根据设计,包含其他控件(如TableLayOutPanel,GroupBox,Panel,FlowLayoutPanel等)的其他控件不是ContainerControl类型,并且不公开KeyEvent。

任何将诸如TextBox,FlowLayoutPanel,TableLayoutPanel之类的对象实例直接投射到ContainerControl的尝试都不会编译:它们不是ContainerControl类型。

接受的答案以及将更正第一个答案的拼写错误的下一个答案中的代码将编译/接受上述实例作为参数,因为您通过将参数类型设置为“ Control”将它们“向下转换”以键入“ Control”

但是在每种情况下,对ControlContainer的强制转换都将返回null,并且传递的实例将被返回(向下转换):本质上是无操作的。

而且,是的,如果您将经过修改的答案代码传递给ActiveControl的父继承路径中的“纯” ControlContainer(如Form实例),它将起作用,但是您仍然在浪费时间来复制“ ActiveControl”的功能。

那么什么是“正版” ContainerControls:检出它们:ContainerControl的MS文档

只有Peter的回答才能真正回答明确的问题,但是这个回答承担了使用互操作的代价,而ActiveControl将为您提供所需的东西。

还要注意,每个控件(容器或非容器)都有一个永远不会为null的Controls Collection,并且很多(我从未尝试过所有控件:我为什么要这么做?)基本的WinForms控件让您“疯狂”东西”,例如将控件添加到“简单”控件(如Button)的ControlCollection中,而不会出现错误。

现在,如果您的问题的真正意图是问您如何找到最外层的ContainerControl ...不在Form本身上...常规的非容器控件嵌套了一些任意级别,那么您可以使用其中的一些答案中的想法:但是代码可以大大简化。

常规控件,ContainerControls,UserControls等(但不是Form!)都具有一个“容器”属性,您可以访问该容器以获取其直接容器,但要确保其固有路径中的“最终容器”不是Form,则需要一些代码“继承”继承树,如此处所示。

您可能还希望检出'Control的'HasChildren属性,该属性通常在处理WinForms中的Focus,ActiveControl和Select问题时很有用。 在这里,回顾Select和Focus之间的差异可能很有价值,因此SO拥有一些很好的资源。

希望这可以帮助。

回答4

Hinek的解决方案对我来说效果很好,除了它是ContainerControl而不是ControlContainer。 (以防万一您在那条红色的蠕动的线条上挠头。)

    public static Control FindFocusedControl(Control control)
    {
        ContainerControl container = control as ContainerControl;
        while (container != null)
        {
            control = container.ActiveControl;
            container = control as ContainerControl;
        }
        return control;
    }
回答5

如果您递归地遵循ActiveControl,那么您是否无法将您带到具有焦点的叶控件?

回答6

ActiveControl并不总是可行,就像SplitContainer一样,ActiveControl.Focused为false。

因此,对于更简单的方法,可以执行以下操作:

private IEnumerable<Control> _get_all_controls(Control c)
{
    return c.Controls.Cast<Control>().SelectMany(item =>
        _get_all_controls(item)).Concat(c.Controls.Cast<Control>()).Where(control =>
        control.Name != string.Empty);
}

var _controls = _get_all_controls(this);
foreach (Control control in _controls) 
    if (control.Focused)
    {
        Console.WriteLine(control.Name);
        break;
    }
标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 创建新的GUI时,WPF是Windows窗体的首选吗? [关闭](When creating a new GUI, is WPF the preferred choice over Windows Forms? [closed])
    问题 从目前的情况来看,这个问题不适合我们的问答形式。 我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。 如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 9年前关闭。 已锁定。 该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。 它目前不接受新的答案或互动。 Windows窗体的大多数限制和技巧对大多数程序员来说都是常见的。 但是从.NET 3.0开始,Windows Presentation Foundation也提供了WPF。 据说您可以使用它使“性感的应用程序”更容易,并且使用.NET 3.5 SP1可以大大提高执行速度。 但是另一方面,WPF的许多工作也有所不同。 我不会说这比较困难,但是您必须从头开始学习“一切”。 我的问题:当您必须创建一个新的GUI并且项目没有时间压力时,花这些额外的时间值得吗? 回答1 WPF使您能够做一些令人惊奇的事情,而我喜欢它……但是,每当开发人员问我是否认为他们应该转向新技术时,我总是有义务限制我的建议。 您的开发人员是否愿意(最好是EAGER)花费时间学习有效使用WPF? 我从没想过要对MFC,Windows Forms甚至是不受管理的DirectX这么说,但是您可能不希望团队在正常开发过程中尝试“挑选” WPF。 循环运输产品!
  • .NET中的属性是什么?(What are attributes in .NET?)
    问题 .NET中的属性是什么?它们有什么用?如何创建自己的属性? 回答1 元数据。 有关您的对象/方法/属性的数据。 例如,我可以声明一个名为:DisplayOrder的属性,这样我就可以轻松控制应在UI中显示哪些顺序的属性。 然后,我可以将其附加到类上并编写一些GUI组件,以提取属性并适当地对UI元素进行排序。 public class DisplayWrapper { private UnderlyingClass underlyingObject; public DisplayWrapper(UnderlyingClass u) { underlyingObject = u; } [DisplayOrder(1)] public int SomeInt { get { return underlyingObject .SomeInt; } } [DisplayOrder(2)] public DateTime SomeDate { get { return underlyingObject .SomeDate; } } } 从而确保在使用我的自定义GUI组件时,始终将SomeInt显示在SomeDate之前。 但是,您将看到它们在直接编码环境之外最常用。 例如,Windows Designer广泛使用它们,因此它知道如何处理自定义对象。
  • 如何编写自动缩放为系统字体和dpi设置的WinForms代码?(How to write WinForms code that auto-scales to system font and dpi settings?)
    问题 简介:有很多评论说“ WinForms不能很好地自动缩放到DPI /字体设置;切换到WPF”。 但是,我认为它基于.NET 1.1。 看来他们实际上在.NET 2.0中实现自动缩放方面做得很好。 至少根据我们到目前为止的研究和测试。 但是,如果你们当中的某些人知道得更多,我们很乐意听取您的意见。 (请不要打扰我们应该切换到WPF ...这不是当前的选择。) 问题: WinForms中的哪些内容不能正确自动缩放,因此应避免? 程序员在编写WinForms代码时应遵循哪些设计准则,以使其能够很好地自动缩放? 到目前为止,我们已经确定的设计准则: 请参阅下面的社区Wiki答案。 那些不正确或不足吗? 我们还应该采用其他准则吗? 还有其他需要避免的模式吗? 任何其他对此的指导将不胜感激。 回答1 不支持正确缩放的控件: 具有AutoSize = False Label ,并且继承了Font 。 在控件上明确设置Font ,使其在“属性”窗口中以粗体显示。 ListView列的宽度不能缩放。 重写窗体的ScaleControl来代替它。 看到这个答案 SplitContainer的Panel1MinSize , Panel2MinSize和SplitterDistance属性具有MultiLine = True TextBox和Font继承。 在控件上明确设置Font ,使其在“属性
  • 在Windows 64位版本的WinForms应用程序中,VS2010不会显示未处理的异常消息(VS2010 does not show unhandled exception message in a WinForms Application on a 64-bit version of Windows)
    问题 创建新项目时,未处理的异常会产生奇怪的行为。 这是我可以重现此问题的方法: 1)创建一个新的Windows窗体应用程序(C#、. NET Framework 4,VS2010) 2)将以下代码添加到Form1_Load处理程序中: int vara = 5, varb = 0; int varc = vara / varb; int vard = 7; 我希望VS中断并在第二行显示未处理的异常消息。 但是,发生的情况是仅跳过了第三行而没有任何消息,并且应用程序继续运行。 我现有的C#项目没有这个问题。 所以我想我的新项目是用一些奇怪的默认设置创建的。 有谁知道我的项目出什么问题了吗??? 我尝试选中“调试”->“异常”中的框。 但是,即使我在try-catch块中处理异常,执行也会中断; 这也不是我想要的。 如果我没记错的话,此对话框中有一列“未处理的异常”或类似的内容,它们可以完全满足我的要求。 但是在我的项目中,只有一列(“ Thrown”)。 回答1 这是一个令人讨厌的问题,由wow64仿真层引起,它允许32位代码在64位版本的Windows 7上运行。它吞噬了响应64位窗口管理器生成的通知而运行的代码中的异常。 ,例如Load事件。 阻止调试器看到它​​并介入。这个问题很难解决,Microsoft的Windows和DevDiv组正在来回指责。 DevDiv对此无能为力
  • Generic.xaml有何特别之处?(What is so special about Generic.xaml?)
    问题 我一直在尝试找出如何组织ResourceDictionary文件以便与团队其他成员重复使用和共享。 我一直遇到“ Generic.xaml”,但是如果我在MSDN上查找Generic.xaml或只是进行Google搜索,我似乎只会收到恰好提到它的博客文章和论坛问题,但似乎无法碰到任何真正权威和清晰的东西。 Generic.xaml和MyRandomlyNamedResourceDictionary.xaml有什么区别? 似乎无论哪种方式,我都必须使用Source属性引用存储在库中的ResourceDictionaries。 例如,: <Application.Resources> <ResourceDictionary Source="/CommonLibraryWpfThemes;component/Themes/Generic.xaml" </Application.Resources> 那么Generic.xaml到底提供了什么优势? 如果我不尝试使应用程序具有多个“外观”(即,如果我只有一个主题),它有任何目的吗? 回答1 WPF中的每个控件都有一个默认样式,该样式除其他外提供控件的默认ControlTemplate 。 WPF在与控件相同的程序集中的Themes文件夹中的特殊资源字典中查找默认样式。 默认样式的键由Control
  • ListBoxItem中的复杂UI(Complex UI inside ListBoxItem)
    问题 在WPF中,我可以通过为ListBox提供ItemTemplate来将任何UI添加到ListBoxItem : <ListBox ItemsSource="{Binding}"> <ListBox.ItemTemplate> <DataTemplate> <Border BorderThickness="1" BorderBrush="Gray" CornerRadius="8" Padding="4,0,4,0"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="50"/> <ColumnDefinition/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition/> <RowDefinition/> <RowDefinition/> </Grid.RowDefinitions> <CheckBox Grid.Column="1" Content="Is Active Customer" IsChecked="{Binding IsActive}"/> <Label Content="Id:" Grid.Row="1" HorizontalAlignment="Right"/> <Label Content="Name:" Grid
  • DotNetBar for WinForms使用教程:图表控件用户指南(一)
    DotNetBar for WinForms是一个拥有89个组件的用户界面控件套包,用户可以使用Visual Studio 2005-2015轻松地创建专业的用户界面。十多年来DotNetBar帮助开发人员轻松地创建易用的专业Windows Forms (WinForms) 用户界面。DotNetBar是全世界第一个引入全功能Office 2013、Office 2010、Windows 7、 Office 2007 style Ribbon控件以及Visual Studio 2005-2013,Metro等主题风格和样式的控件。 点击下载新版DotNetBar for WinForms 架构概述 (注意:本文档中介绍的许多ChartControl的选项和功能,在DotNetBar Samples文件夹中的ChartControl Demo Applications中都有演示。请参考它作为一个额外的信息和帮助的来源。) 以下是ChartControl的体系结构的基本概述。 (此体系结构中包含的项目将在本文档的后面部分进行详细说明)。 组件概述 下面的图片说明了ChartControl中的主要组件。 在第一张图中,我们有4个独立的图表,每个图表占用一个2×2定义矩阵的单个单元格(见ChartMatrix)。 每个矩阵单元格(或单元格范围
  • 在.NET(Winforms)中的表格内居中控制?(Centering controls within a form in .NET (Winforms)?)
    问题 我正在尝试在表单中居中放置固定大小的控件。 出于兴趣,是否有一种非愚蠢的方法? 我真正想要的是类似于text-align css属性的东西。 目前,我正在将周围表单的padding属性设置为适当的大小,并将控件的Dock属性设置为fill。 回答1 您可以通过使用anchors实现此目的。 或者更确切地说是不使用它们。 默认情况下,控件锚定在窗体的左上角,这意味着当更改窗体大小时,它们与窗体左上角的距离将保持不变。 如果将控件锚点更改为左下角,则在调整表单大小时,控件将与表单的底部和左侧保持相同的距离。 在调整大小时,在某个方向上关闭锚点将使控件在该方向上居中。 注意:在VS2015中通​​过属性窗口关闭锚点可能需要输入None,None(而不是默认的Top,Left)。 回答2 myControl.Left = (this.ClientSize.Width - myControl.Width) / 2 ; myControl.Top = (this.ClientSize.Height - myControl.Height) / 2; 回答3 因为您不声明表单是否可以调整大小,所以如果您不关心调整大小,有一种简单的方法(如果您愿意,请使用Mitch Wheats解决方案): 选择控件->格式(菜单选项)->窗口中心->水平或垂直 回答4 我找到了一种很好的方法来执行此操作
  • Winforms双缓冲(Winforms Double Buffering)
    问题 我将此添加到表单的构造函数代码中: this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true); 但是,当加载控件时,无论控件何时更改(窗体及其组件经常更改(需要更新)),它仍然显示出丑陋的工件。 我需要做些什么? 回答1 这仅对表单本身有影响,而对子控件没有影响。 如果您有很多人,那么他们轮流绘画自己的时间就变得很明显,它会留下一个矩形孔,在该处控件会一直填充,直到子控件将其旋转为止。 要解决这个问题,您需要对整个表单和控件进行双重缓冲。 自Windows XP启用WS_EX_COMPOSITED样式标志以来,该选项就可用。 将此粘贴到您的表单中以将其打开: protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED return cp; } } 它根本无法加快绘画速度,但是延迟一段时间后,表格会吸附在屏幕上。 消除可见的油漆瑕疵。 真正解决延迟问题无需使用控件。
  • 从控件的构造函数中检测设计模式(Detecting design mode from a Control's constructor)
    问题 紧接着这个问题,是否有可能从对象的构造函数中检测出是处于设计模式还是运行时模式? 我意识到这可能是不可能的,并且我必须更改我想要的内容,但是现在我对这个特定的问题感兴趣。 回答1 您可以在System.ComponentModel命名空间中使用LicenceUsageMode枚举: bool designMode = (LicenseManager.UsageMode == LicenseUsageMode.Designtime); 回答2 您是否正在寻找这样的东西: public static bool IsInDesignMode() { if (Application.ExecutablePath.IndexOf("devenv.exe", StringComparison.OrdinalIgnoreCase) > -1) { return true; } return false; } 您也可以通过检查进程名称来做到这一点: if (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv") return true; 回答3 组件...据我所知没有DesignMode属性。 此属性由Control提供。 但是问题在于,当CustomControl位于设计器的窗体中时
  • System.Windows.Threading.Dispatcher和WinForms?(System.Windows.Threading.Dispatcher and WinForms?)
    问题 System.Windows.Threading.Dispatcher是否可以在WinForms应用程序的UI线程上工作? 如果是,为什么? 它来自WindowsBase.dll,它似乎是WPF组件。 如果没有,如何将工作单元重新调用到UI线程上? 我已经找到Control.BeginInvoke(),但是创建仅引用原始线程的控件似乎很笨拙。 回答1 您甚至可以在WinForms应用程序中使用Dispatcher 。 如果您确定要使用UI线程(例如,在button.Click处理程序中),则Dispatcher.CurrentDispatcher将为您提供UI线程分派器,您以后可以使用该分派器照常从后台线程分派到UI线程。 回答2 Dispatcher是WPF组件,而不是WinForms组件。 如果要在UI线程上分派工作项,则必须使用已经发现的Control.BeginInvoke,或对线程之间的ResetEvents / WaitObjects做出反应。 通常,除非是UI工作(例如,更新控件的内容等),否则在UI线程上调用工作项是一件坏事,在这种情况下,Control.BeginInvoke()就足够了。 回答3 我对问题“在WinForms上使用TPL进行并行编程”的回答中提供了一个在Windows Form中使用System.Windows.Threading
  • 属性与字段:需要帮助来掌握属性在字段上的使用(Properties vs. Fields: Need help grasping the uses of Properties over Fields)
    问题 首先,我已经阅读了有关该主题的帖子列表,并且由于了解封装和字段修饰符(private,public..ect),因此我不了解属性。 我已经学到的C#的主要方面之一是使用封装在代码中保护数据的重要性。 我“认为”我理解这是因为使用了修饰符(私有,公共,内部,受保护)的能力。 但是,在了解了属性之后,我不仅在理解属性使用方面,而且在理解C#中数据保护的总体重要性/能力(我理解为封装)时也感到费解。 更具体地说,当我使用C#属性时,我读到的所有内容是,由于以下原因,您应该尝试使用它们代替字段: 1)它们允许您在直接访问字段时无法更改数据类型。 2)它们为数据访问添加了一定程度的保护 但是,从我的“想法”开始,我发现使用字段修饰符确实是#2,除非您没有理由更改类型(#1),否则在我看来属性只会生成其他代码-因为(或多或少)创建隐藏方法来访问字段,而不是直接访问字段。 然后可以将整个修饰符添加到“属性”中,这进一步使我对属性访问数据的需求的理解更加复杂。 我已经阅读了不同作者关于“属性”的许多章节,但没有一章真正说明了对属性vs.字段vs.封装(以及良好的编程方法)的良好理解。 有人可以解释: 1)为什么我要使用属性而不是字段(特别是当它出现时,我只是添加其他代码 2)在跟踪其他人的代码时,关于识别属性的使用并且不将其视为简单方法的任何提示(除了get; set是显而易见的)? 3
  • 如何在WinForms中设置面板的不透明度或透明度?(How can I set the opacity or transparency of a Panel in WinForms?)
    问题 我想知道如何更改或修改C#中Panel的透明度,而不是整个表单,而仅更改面板。。我看过很多关于Opacity的C#教程,但是有关Form的。 我正在寻找仅使用面板可能的方法。 谢谢你! 回答1 是的,不透明度只能在顶级窗口上使用。 它使用视频适配器的硬件功能,该功能不支持子窗口,例如Panel。 Winforms中唯一的顶级Control派生类是Form。 但是,有几个“纯” Winform控件(它们自己完成绘画而不是让本机Windows控件完成任务)支持透明的BackColor。 面板就是其中之一。 它使用了一个技巧,要求父级自己绘制以产生背景像素。 此技巧的一个副作用是重叠的控件不起作用,您只能看到父像素,而看不到重叠的控件。 此示例表单显示了它的工作方式: public partial class Form1 : Form { public Form1() { InitializeComponent(); this.BackColor = Color.White; panel1.BackColor = Color.FromArgb(25, Color.Black); } protected override void OnPaint(PaintEventArgs e) { e.Graphics.DrawLine(Pens.Yellow, 0, 0, 100, 100)
  • 使用C#WinForms的透明图像(Transparent images with C# WinForms)
    问题 我正在VS 2008中开发Windows窗体应用程序,我想将一个图像显示在另一个图像的顶部,顶部图像是gif或具有透明部分的东西。 基本上,我有一个大图像,如果要在上面放一个小图像,这样它们对于用户来说就好像是一个图像。 我一直在尝试使用图片框,但这似乎没有用,有什么建议吗? 回答1 几天前我也处于类似情况。 您可以创建一个透明控件来承载图像。 using System; using System.Windows.Forms; using System.Drawing; public class TransparentControl : Control { private readonly Timer refresher; private Image _image; public TransparentControl() { SetStyle(ControlStyles.SupportsTransparentBackColor, true); BackColor = Color.Transparent; refresher = new Timer(); refresher.Tick += TimerOnTick; refresher.Interval = 50; refresher.Enabled = true; refresher.Start(); } protected
  • DevExpress WinForms帮助文档:表单和用户控件 -开机图像
    点击获取DevExpress完整版下载 DevExpress技术交流群3:700924826 欢迎一起进群讨论 启动画面管理器允许您将任何图像显示为启动画面。 主要功能包括: 支持图像透明性,因此初始图像可能是不规则的形式,并且可能包含阴影。 支持设计时自定义。 可以在主表单启动时自动显示和关闭。 允许您自定义绘制图像。 通过命令与启动表单进行交互。 用代码创建和显示启动图像 这种方法使您可以用一行代码将任何图像显示为初始屏幕,您可以使用自定义的绘图器绘制初始图像(例如,绘制进度指示器)。 要调用启动图像,请调用静态SplashScreenManager.ShowImage方法,将目标图像指定为参数。 若要隐藏图像,请调用静态SplashScreenManager.HideImage方法。 C# Image im = Image.FromFile("mySplashScreen.png"); SplashScreenManager.ShowImage(im); //... SplashScreenManager.HideImage(); VB.NET Dim im As Image = Image.FromFile("mySplashScreen.png") SplashScreenManager.ShowImage(im) '... SplashScreenManager
  • ASP.NET网站还是ASP.NET Web应用程序?(ASP.NET Web Site or ASP.NET Web Application?)
    问题 在Visual Studio中启动新的ASP.NET项目时,可以创建ASP.NET Web应用程序,也可以创建ASP.NET网站。 ASP.NET Web应用程序和ASP.NET网站之间有什么区别? 我为什么要选择一个呢? 根据我使用的Visual Studio版本,答案是否有所不同? 回答1 网站: 该Web站点项目是即时编译的。 您最终将获得更多的DLL文件,这可能会很痛苦。 当您在一个目录中有页面或控件需要引用另一目录中的页面和控件时,这也会带来问题,因为该另一目录可能尚未编译到代码中。 另一个问题可能是在发布中。 如果不要求Visual Studio不断重复使用相同的名称,它将为页面始终生成的DLL文件提供新的名称。 这可能会导致具有相同类名的DLL文件的多个紧密副本,这将产生大量错误。 该Web站点项目是随Visual Studio 2005一起引入的,但事实证明它并不受欢迎。 Web应用程序: Web应用程序项目是作为外接程序创建的,现在作为Visual Studio 2005的SP 1的一部分存在。主要区别在于Web应用程序项目的设计工作原理与Visual Studio 2003附带的Web项目类似。在构建时将应用程序编译为单个DLL文件。 要更新项目,必须重新编译该项目并发布DLL文件以进行更改。 Web应用程序项目的另一个不错的功能是
  • 无法加载文件或程序集或其依赖项之一(Could not load file or assembly or one of its dependencies)
    问题 我遇到了另一个“无法加载文件或程序集或其依赖项”问题。 附加信息:无法加载文件或程序集“ Microsoft.Practices.Unity,版本= 1.2.0.0,区域性=中性,PublicKeyToken = 31bf3856ad364e35”或其依赖项之一。 找到的程序集的清单定义与程序集引用不匹配。 (来自HRESULT的异常:0x80131040) 我不知道是什么原因造成的,或者我如何调试它以找到原因。 我已经在我的解决方案目录.csproj文件中进行了搜索,并且在拥有Unity的每个地方都有: 参考Include =“ Microsoft.Practices.Unity,版本= 2.0.414.0,文化=中性,PublicKeyToken = 31bf3856ad364e35,processorArchitecture = MSIL” 在我的任何项目中都找不到任何与1.2.0.0背离的参考。 有什么想法我应该去解决这个问题吗? 通常,我还将感谢有关如何调试此类问题的技巧。 回答1 检查您是否引用了一个程序集,而该程序集又引用了旧的unity版本。 例如,假设您有一个名为ServiceLocator.dll的程序集,该程序集需要一个旧版本的Unity程序集,现在,当您引用ServiceLocator您应该为它提供旧版本的Unity,这便引起了问题。
  • 如何使用WinForms进度栏?(How to use WinForms progress bar?)
    问题 我想显示在外部库中执行的计算进度。 例如,如果我有一些计算方法,并且想在Form类中将其用于100000个值,我可以编写: public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Caluculate(int i) { double pow = Math.Pow(i, i); } private void button1_Click(object sender, EventArgs e) { progressBar1.Maximum = 100000; progressBar1.Step = 1; for(int j = 0; j < 100000; j++) { Caluculate(j); progressBar1.PerformStep(); } } } 我应该在每次计算之后执行步骤。 但是,如果我在外部方法中执行所有100000计算,该怎么办? 如果我不想使此方法依赖进度条,什么时候应该“执行步骤”? 例如,我可以写 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void CaluculateAll(System
  • WinForms中的水印文本框(Watermark TextBox in WinForms)
    问题 谁能指出我对基本Windows Forms TextBox的良好实现,它最初将显示水印文本,当光标进入该文本时会消失吗? 我想我可以通过创造性地使用Enter和Leave事件来创建自己的应用程序,但是我敢肯定某个地方有一个完全可用的实现。 我看到了WPF的实现,必要时可以嵌套它,但是使用本机WinForms TextBox派生会更好。 到目前为止,我已经知道了。 还没有尝试过,但是有人看到明显的问题吗? public class WatermarkTextBox:TextBox { public string WatermarkText { get; set; } public Color WatermarkColor { get; set; } private Color TextColor { get; set; } private bool isInTransition; public WatermarkTextBox() { WatermarkColor = SystemColors.GrayText; } private bool HasText { get { return Text.IsNotNullOrBlankOr(WatermarkText); }} protected override void OnEnter(EventArgs e) { base
  • 用C#编码表单时无法查看设计器(Can't view designer when coding a form in C#)
    问题 我正在使用winforms上的本教程,到目前为止,本教程是在不使用工具箱的情况下对表单进行编码的。 我相信它将在不久后更深入地介绍该工具箱。 在学习完本教程之后,我在下面的两段代码中做了一个局部类: 第一个档案: using System; using System.Windows.Forms; public class Numeric : System.Windows.Forms.TextBox { public Numeric() { } } public partial class Exercise { private Numeric txtbox; System.ComponentModel.Container components; } 第二档: using System; using System.Windows.Forms; public partial class Exercise : Form { private void InitializeComponent() { txtbox = new Numeric(); Controls.Add(txtbox); } public Exercise() { InitializeComponent(); } } public class program { public static int Main() {