天道酬勤,学无止境

如何找到以前的活动控件C#(How to find previous active control c#)

问题

我正在开发键盘控件,非常简单地嵌入到窗体中。 使用sendkey类执行char输入。 要使此功能起作用,需要知道先前选择的控件。

回答1

像下面这样的东西应该可以解决问题:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace DragDropTest
{
    public partial class LostFocusTestForm : Form
    {
        private Control _lastControl;

        public LostFocusTestForm()
        {
            InitializeComponent();

            TrapLostFocusOnChildControls(this.Controls);
        }
        private void finalTextBox_Enter(object sender, EventArgs e)
        {
            MessageBox.Show("From " + _lastControl.Name + " to " + this.ActiveControl.Name);
        }

        private void AllLostFocus(object sender, EventArgs e)
        {
            _lastControl = (Control)sender;
        }

        private void TrapLostFocusOnChildControls(Control.ControlCollection controls)
        {
            foreach (Control control in controls)
            {
                control.LostFocus += new EventHandler(AllLostFocus);

                Control.ControlCollection childControls = control.Controls;
                if (childControls != null)
                    TrapLostFocusOnChildControls(childControls);
            }
        }
    }
}
回答2

扩展大卫的答案。 这是您可以使用Enter事件和变量来存储最后一个控件的方式:

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        Control lastControlEntered = null;

        public Form1()
        {
            InitializeComponent();

            foreach (Control c in Controls)
                if (!(c is Button)) c.Enter += new EventHandler(c_Enter);
        }

        void c_Enter(object sender, EventArgs e)
        {
            if (sender is Control)
                lastControlEntered = (Control)sender;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            label1.Text = lastControlEntered == null ? "No last control" : lastControlEntered.Name;
        }
    }
}

若要运行此代码,请向Visual Studio中的“窗体”中添加一些文本框和其他控件,并添加一个按钮和一个标签,并将该按钮的单击处理程序附加到button1_Click。 当您按下按钮时,标签中会显示您在按下按钮之前所处的最后一个控件。 编辑此代码以适合您的需求。

回答3

您需要将其存储在变量中。 对于控件对象,存在“ Enter”事件

回答4

另一种策略是使用扩展方法来扩展Control.ControlCollection,然后使用某些间接调用(委托)以递归方式解析Form的Controls集合,并添加一个用于更新静态变量的特殊“ Enter”处理程序。 通过跟踪先前的Active Control和当前的Active Control,您便可以找到所需的信息……如果我完全理解您的问题。 这是一个需要FrameWork 3.5或4.0的示例。

//在Public静态类中:

using System;
using System.Collections.Generic;
using System.Windows.Forms;

private static EventHandler _event;

    // extension method on Control.ControlCollection
    public static void SetEnterEvent(this Control.ControlCollection theCollection, EventHandler theEvent)
    {
        _event = theEvent;
        recurseSetEnter(theCollection);
    }

    // recurse all the controls and add the Enter Event :

    public static void recurseSetEnter(Control.ControlCollection aCollection)
    {
        foreach (Control theControl in aCollection)
        {
            // "weed out" things like internal controls of the NumericUpDown Control
            // String.IsNullOrWhiteSpace is FrameWork 4.0
            // use Trim() followed by String.IsNullOrEmpty for FrameWork 3.5
            if (!String.IsNullOrWhiteSpace(theControl.Name))
            {
                Console.WriteLine("setting enter handler for : " + theControl.Name + " : " + theControl.GetType().ToString());

                theControl.Enter += _event;
            }

            if (theControl.Controls.Count > 0) recurseSetEnter((Control.ControlCollection)theControl.Controls);
        }
    }

那么我们如何在表单中使用它:

首先,让我们定义一个实际的事件处理程序,该事件处理程序将在任何控件上遇到Enter事件时实际执行:

我们将当前的活动控件和先前的活动控件保留在公共静态变量中:

public static Control theActiveControl = null;

public static Control thePreviousControl = null;

这是执行更新的代码:

private void control_enter(object sender, EventArgs e)
{
    thePreviousControl = theActiveControl;
    theActiveControl = sender as Control;
    Console.WriteLine("Active Control is now : " + theActiveControl.Name);
}

现在在Form_Load事件或其他地方,我们只需要连接事件即可:

// in a Form**

    // define a delegate for the enter Event
    private event EventHandler enter = delegate { };

// in the form load even or somewhere : assign an actual event handler to the delegate
    enter += new EventHandler(control_enter);

最后,我们在Form的Controls集合上调用extension方法:

this.Controls.SetEnterEvent(enter);

讨论:WinForm维护一个'ActiveControl集合:它将包含指向最近激活的控件的指针,无论它在一个或多个容器中的嵌套深度如何... ...某些容器(如Panels)不会在其中注册为活动控件此集合,即使它们具有“离开/输入”事件...当控件被使用/选择/进入/集中显示时,它们也将变为ActiveControl。不幸的是,没有“ ActiveControlChanged”事件。

在实践中,我正在使用“过滤器”进行开发,因此我可以有选择地跳过某些对象类型,或者例如,寻找一些“键”(在控件名称或其标签中)以确定是否添加处理程序……是的……这是一个实验。 [编辑]

[edit]请注意,诸如PictureBox之类的某些控件不会公开'Enter事件,但是此代码不会导致错误:我的长期目标是找到一种方法,无需进行反思即可测试特定控件是否确实公开了给定的'event在我安装它之前:因为我认为让PictureBox之类的东西“摆动”是不明智的做法。 到目前为止,我还没有找到正确的“容器状态”“测试”(事实证明“ ControlContainer”是错误的轨道)。 您可能还注意到,例如,面板公开了“ Enter”事件,但是只有在激活面板内部的某些控件时才会触发该事件。 [编辑]

希望这会有所帮助。 我敢肯定,使用Lambdas可能会写得更优雅,但就此而言,我还是Skeet树叶上的“幼虫” :)

回答5

您可以通过以下方式执行此操作:字符串activeControl = this.ActiveControl.Name

回答6

您必须自己对此进行跟踪。 编写一个琐碎的UIElement.LostFocus处理程序,该处理程序将发送方置于“具有焦点的最后一个控件”变量中,您已完成。

注意:WPF。 不确定是否要执行此操作或WinForms。 最近我做了很多WPF,我已经把它放在脑子里了。

标签

受限制的 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>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何停止ActiveX对象在办公室中自动更改大小?(How to stop ActiveX objects automatically changing size in office?)
    问题 该线程讨论了我在Excel电子表格中使用ActiveX对象时遇到的问题。 通读混乱,最终没有一个连贯的答案。 问题是100%可复制: 使用扩展坞时使用电子表格中的ActiveX对象打开工作簿断开计算机与扩展坞的连接,触发分辨率更改(还有其他原因,我的扩展坞也存在,似乎更改分辨率会导致此问题) 单击一个ActiveX控件-它们立即调整大小,并且字体更改大小。 fontsize的更改不是.Font.Size参数的函数,而是在发生问题后无法更改的内容,除了不断增加fontsize之外 唯一看似权威的解决方案涉及MS修补程序(不过,几年前它是“修补程序”,因此对于完全部署而言似乎不可行)和注册表编辑,这对我的用例而言并不实际。 我正在寻找一种方法: 防止发生这种变化找到最好的解决方法 网上缺少有关此问题的权威信息。 我打算将我的工作发布出去,但是,它甚至还没有接近理想,我更希望有一个更好的解决方案。 回答1 我的解决方法是以编程方式遍历工作表*上的所有OLE对象,并将代码写入调试器,然后在工作表上包括一个基本上“调整对象大小”的按钮-并说明为什么会出现此问题。 此方法将生成驱动该按钮的代码。 但是,它不会自动更新-它是一个快照,仅应在部署应用程序之前立即使用(如果最终用户将具有按钮功能)。 然后,该序列变为: 运行以下方法生成的代码立即保存工作簿
  • 如何在C#Windows窗体应用程序中激活spellCheck?(How to activate spellCheck in C# Windows Form Application?)
    问题 我正在Visual Studio 2012中制作一个C#Windows窗体应用程序。我想添加一个具有拼写检查功能的文本框。 您能给我解释一下这个过程吗? 回答1 如果使用的是.net4,则可以将References System.Xaml和WindowsFormsIntegration添加到Winforms项目中。 这使您可以在工具箱中找到ElementHost 。 通过使用ElementHost,可以在Winfroms项目中使用WPF对象。 System.Windows.Forms.Integration.ElementHost elementHost1 = new System.Windows.Forms.Integration.ElementHost(); System.Windows.Controls.TextBox textBox = new System.Windows.Controls.TextBox(); textBox.SpellCheck.IsEnabled = true; elementHost1.Child = textBox; 回答2 Windows窗体文本框上没有内置的拼写检查功能。 您能做的最好的事情可能是在表单中嵌入WPF文本框。 汉斯·帕桑特(Hans Passant)在这篇文章中就如何实现这一目标给出了非常详尽的答案。 回答3
  • 是否可以复制某个控件的所有属性? (C#窗口形式)(It is possible to copy all the properties of a certain control? (C# window forms))
    问题 例如,我有一个带有Blue BackgroundColor属性等的DataGridView控件,是否可以将这些属性以编程方式传输或传递给另一个DataGridView控件? 像这样的东西: dtGrid2.Property = dtGrid1.Property; // but of course, this code is not working 谢谢... 回答1 您将需要使用反射。 您可以获取对源控件中每个属性的引用(基于其类型),然后“获取”其值-将该值分配给目标控件。 这是一个粗略的例子: private void copyControl(Control sourceControl, Control targetControl) { // make sure these are the same if (sourceControl.GetType() != targetControl.GetType()) { throw new Exception("Incorrect control types"); } foreach (PropertyInfo sourceProperty in sourceControl.GetType().GetProperties()) { object newValue = sourceProperty.GetValue
  • 在C#中删除动态创建的控件(Removing dynamically created controls in C#)
    问题 我有一个程序,在图形中添加了一系列“斑点”: PictureBox blip = new PictureBox(); blip.Location = new Point(blipHours, blipAltitude); blip.Size = new Size(6, 6); blip.BackColor = System.Drawing.Color.Lime; blip.Text = ""; blip.Name = callsign; this.Controls.Add(blip); this.Controls.SetChildIndex(blip, 0); 如何使用按钮清除使用此代码创建的所有“笔尖”? 当笔尖的名称等于某个callsign时,是否可以更改笔尖的背景颜色? 每个笔触都与ListBox一个选择相关联,我想在用户选择它时更改其颜色。 回答1 每个人都忘记了一个非常重要的细节:您必须使用Dispose()控件,否则它将永远泄漏: for (int ix = this.Controls.Count - 1; ix >= 0; ix--) { if (this.Controls[ix] is PictureBox) this.Controls[ix].Dispose(); } 我将更加强调forever子句,在注释中大声疾呼,Control类的行为不像其他任何
  • Bot框架获取嵌入式聊天控制页面的ServiceUrl(Bot framework get the ServiceUrl of embedded chat control page)
    问题 我想将聊天控件嵌入到许多网站中,并且想要获得我嵌入的网站的网址,以便我的机器人可以获取与网站URL匹配的数据。 但是,当我嵌入从WebChat生成的iframe时,总是得到相同的ServiceUrl,即https://webchat.botframework.com/ ,它不是网站的网址,因此如何将聊天控件嵌入到任何网站网站和我的机器人可以获取网站网址,而不是WebChat或DirectLine的网址。 这是我尝试过的方法:直线聊天控制 这是我使用已发布的漫游器测试的结果: 我注意到,当我用Bot Framework Emulator测试我的机器人时,它总是返回发送方的确切网址(如果是本地testingm,它将返回http:// localhost:XXXX /)。 那么我们该怎么做呢? 回答1 我认为可以通过使用BackChannel来实现此目的,它可以使机器人与通过WebChat嵌入机器人的页面进行通信。 它可以让您: 将事件发送到托管WebChat实例的页面侦听承载WebChat实例的页面中的事件 当然,第一部分是HTML页面,它将包含您放在一起的内容以及发送/监听事件的逻辑。 带有基本逻辑的示例页面可以在此处找到,下面是带有事件相关代码的图像。 现在,您需要准备您的机器人以侦听和发送事件。 Node.js有一个示例,展示了如何执行此操作。 将其移植到C#
  • 在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
  • 如何快速将视图控制器弹出到以前的视图控制器之一?(How to pop view controller to one of the previous view controllers in swift?)
    问题 我一直试图将我的视图控制器弹出到我的视图堆栈中的以前的视图控制器之一。 假设在我的视图堆栈中有firstVC,secondVC,thirdVC和fourthVC视图控制器。 当前的视图控制器是第四个,而在fourthVC中有一个表视图。 如果用户删除tableview中的所有行,则应将用户定向到secondVC 。 我有个想法,我将创建另一个Navigationcontroller并将其与presentViewController命令一起呈现。 但是,这不是我的问题的解决方案。 因为我认为这种情况下会出现导航问题。 如何找到这种情况的最佳解决方案? 谢谢您的回答,最好的问候 回答1 与其执行一般的popViewControllerAnimated:调用, popToViewController:animated:使用popToViewController:animated: 在这种情况下,您可以检测到用户是否已删除所有行,请执行以下操作(否则仅弹出一个视图控制器): let viewControllers: [UIViewController] = self.navigationController!.viewControllers as [UIViewController]; self.navigationController!.popToViewController
  • 使用AngularJS设置活动标签样式(Set active tab style with AngularJS)
    问题 我在AngularJS中设置了这样的路由: $routeProvider .when('/dashboard', {templateUrl:'partials/dashboard', controller:widgetsController}) .when('/lab', {templateUrl:'partials/lab', controller:widgetsController}) 我在顶部栏上有一些链接的标签样式。 如何根据当前模板或URL将“活动”类添加到选项卡? 回答1 一种无需依赖URL即可解决此问题的方法是在$routeProvider配置期间向每个部分添加自定义属性,如下所示: $routeProvider. when('/dashboard', { templateUrl: 'partials/dashboard.html', controller: widgetsController, activetab: 'dashboard' }). when('/lab', { templateUrl: 'partials/lab.html', controller: widgetsController, activetab: 'lab' }); 在您的控制器中公开$route : function widgetsController($scope,
  • 在Listbox.ItemTemplate(WPF C#)中查找控件(Find control inside Listbox.ItemTemplate (WPF C#))
    问题 我在StackPanel找到正确的TextBlock控件时遇到一些问题。 我的标记: <ListBox Name="lstTimeline" ItemContainerStyle="{StaticResource TwItemStyle}" MouseDoubleClick="lstTimeline_MouseDoubleClick"> <ListBox.ItemTemplate> <DataTemplate> <DockPanel MaxWidth="{Binding ElementName=lstTimeline, Path=ActualWidth}"> <Border Margin="10" DockPanel.Dock="Left" BorderBrush="White" BorderThickness="1" Height="48" Width="48" HorizontalAlignment="Center"> <Image Source="{Binding ThumbNail, IsAsync=True}" Height="48" Width="48" /> </Border> <StackPanel Name="stkPanel" Margin="10" DockPanel.Dock="Right"> <TextBlock Text="{Binding
  • 如何在.NET(C#)中获取UserControl的HTML输出?(How do I get the HTML output of a UserControl in .NET (C#)?)
    问题 如果我创建一个UserControl并向其中添加一些对象,该如何获取将呈现的HTML? 前任。 UserControl myControl = new UserControl(); myControl.Controls.Add(new TextBox()); // ...something happens return strHTMLofControl; 我只想将一个新建的UserControl转换为HTML字符串。 回答1 您可以使用Control.RenderControl(HtmlTextWriter)呈现控件。 将StringWriter馈送到HtmlTextWriter 。 将StringBuilder馈送到StringWriter 。 您生成的字符串将在StringBuilder对象内。 这是此解决方案的代码示例: string html = String.Empty; using (TextWriter myTextWriter = new StringWriter(new StringBuilder())) { using (HtmlTextWriter myWriter = new HtmlTextWriter(myTextWriter)) { myControl.RenderControl(myWriter); html = myTextWriter
  • Microsoft Visual Studio和C#:如何以可视方式向控件添加事件?(Microsoft Visual Studio and C#: How to Visually Add Events to Controls?)
    问题 如何使用C#将事件处理程序添加到Microsoft Visual Studio(2008)中的窗体中的控件中? 我可以手动执行此操作,但是可以打开Form的Designer.cs文件,但是找不到通过界面执行此操作的方法。 在带有C ++和MFC的MSVC 6中,您可以右键单击或执行其他操作,然后找到该控件的所有可能事件的列表。 然后选择它,它将弹出一个窗口,让您创建一个与该事件关联的方法。 在VB中,它甚至更容易,您可以在代码中完成操作,并且它在方法下拉列表中列出了所有事件。 但是,我在2008年用C#找不到任何种类的东西。 Intellisense有助于填写正确的方法信息。 但是,它总是在Designer.cs文件中创建方法,而不是应在分类的另一半中创建方法。 回答1 在设计器中,单击感兴趣的控件。 在属性窗口中(按F4键将其调出),应该有一个闪电图标。 单击该图标可将您带到该控件的可用事件列表。 双击事件名称将连接存根处理程序,并转到其背后的代码。 编辑:精明的读者将看到发布的屏幕截图适用于Web应用程序(翻转),但对于winforms应用程序则完全相同。 回答2 您所要做的就是在设计器视图中打开表单/控件,使焦点/选定的控件处于选中状态,打开属性视图,然后移至“事件”选项卡。 双击您有兴趣处理的事件。 替代文字http://img222.imageshack.us
  • 如何使用Xamarin或Dot42使用async / await在C#中实现Android回调?(How to implement Android callbacks in C# using async/await with Xamarin or Dot42?)
    问题 如何使用Xamarin for Android使用async / await在C#中实现回调? 与Android的标准Java编程相比,这又如何呢? 回答1 使用Xamarin for Android 4.7,在撰写本文时仍处于公开可用的beta中,我们可以使用.NET 4.5功能来实现“异步”方法和对它们的“等待”调用。 一直困扰着我,如果Java中需要任何回调,则函数中代码的逻辑流被中断,则当回调返回时,您必须在下一个函数中继续执行代码。 考虑这种情况: 我想收集一个Android设备上所有可用的TextToSpeech引擎的列表,然后询问它们中的每种已安装的语言。 我编写的小“ TTS设置”活动向用户显示了两个选择框(“旋转框”),其中一个列出了该设备上所有TTS引擎支持的所有语言。 下面的另一个框列出了在第一个框中选择的语言的所有可用语音,同样来自所有可用的TTS引擎。 理想情况下,此活动的所有初始化都应在一个函数中进行,例如在onCreate()中。 使用标准Java编程是不可能的,因为: 这需要两个“破坏性”回调–首先是初始化TTS引擎–仅当调用onInit()时,它才能完全运行。 然后,当我们有一个初始化的TTS对象时,我们需要向它发送一个“ android.speech.tts.engine.CHECK_TTS_DATA”意图
  • 如何获得asp.net登录控件以自动验证以前通过身份验证的用户?(How to get the asp.net login control to auto authenticate a previously authenticated user?)
    问题 我试图设置登录控件,以记住先前已成功输入用户名和密码的用户的登录凭证。 我将“记住我”属性设置为true,但似乎没有触发任何我可以读取Cookie并自动登录用户的事件。 是否有一个简单的机制可以实现这一目标? 回答1 您需要在ASP.NET 2.0中使用Google进行表单身份验证 您将需要设置应用程序(通过web.config),还可能需要更改IIS设置。 尽管一切都非常简单,但仍有很多可用的设置,因此最好阅读一些文章。 ScottGu的博客条目涉及很多详细信息。 在www.asp.net上也有很多不错的视频,包括这些安全教程。 尝试如何:创建ASP.NET登录页面和演练:创建具有成员资格和用户登录名的网站。 如果我还记得的话,除非您使用Sql Server Membership提供程序,否则您仍然必须自己进行身份验证。 在这种情况下,您仍然必须设置数据库和web.config。 本质上,一旦正确设置了配置,便会有一个登录页面。 在登录页面告诉窗体身份验证,一旦你验证他们的身份为您创建身份验证票证: if (VerifyUser(name, password) ) // this is not a framework method FormsAuthentication.RedirectFromLoginPage( userName, false); // no
  • C#WinForms ErrorProvider控件(C# WinForms ErrorProvider Control)
    问题 有谁知道是否有一种方法来获取具有ErrorProvider图标处于活动状态的控件的列表。 IE。 验证失败的任何控件。 我试图避免循环窗体中的所有控件。 我想显示某种消息,指示表单上有多少错误。 由于我的表单包含选项卡,因此我试图使用户知道不活动的选项卡上可能存在错误,因此他们需要检查所有选项卡。 谢谢 巴里 回答1 这属于“您怎么可能不知道”类别。 是您的代码正在调用ErrorProvider.SetError(),您应该可以轻松跟踪仍在活动的错误数量。 这是一个小帮手类,使用其SetError()方法更新ErrorProvider。 其Count属性返回活动错误的数量: private class ErrorTracker { private HashSet<Control> mErrors = new HashSet<Control>(); private ErrorProvider mProvider; public ErrorTracker(ErrorProvider provider) { mProvider = provider; } public void SetError(Control ctl, string text) { if (string.IsNullOrEmpty(text)) mErrors.Remove(ctl); else if (
  • C#在应用程序中获取.net控件的ScreenShot并将其附加到Outlook电子邮件[重复](C# Take ScreenShot of .net control within application and attach to Outlook Email [duplicate])
    问题 这个问题已经在这里有了答案: C#:如何对屏幕的一部分进行屏幕截图(4个答案) 1年前关闭。 有谁知道如何使用C#截屏并将其限制为对应用程序的特定容器/部分进行拍照。 我不需要应用程序的整个屏幕或整个窗口。 我的面板简称为:panel1用户将单击“按钮”并获取panel1的屏幕截图并附加到电子邮件。 我只想对该部分截屏,然后本地保存到C:\ Drive和/或附加或嵌入到Outlook电子邮件中。 我在互联网上阅读了其他各种内容,但是其中大多数都需要处理一些复杂的更改,例如为我不需要的Web浏览器控件截屏。 回答1 如果只想获取Panel's屏幕截图,则可以使用内置的DrawToBitmap方法。 Bitmap bmp = new Bitmap(myPanel.Width, myPanel.Height); myPanel.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height)); bmp.Save(@"C:\MyPanelImage.bmp"); 请注意,某些控件可能无法使用此功能,例如WebBrowser和RichTextBox控件,但它应适用于大多数其他控件(文本框,标签等)。 回答2 我使用类似的方法 public static void TakeCroppedScreenShot( string
  • 如何遍历treeView控件的所有节点。 C#(How to Iterate through all nodes of a treeView Control. C#)
    问题 我正在选择form所有控件 如果控件是Treeviews ,则将迭代它们具有的所有节点 我需要类似的东西:(这是我的代码) foreach (Control c in PanelSM.Controls) { if (c is TreeView) { TreeNodeCollection myNodes = c.Nodes;//<<<<< Here is a mistake foreach (TreeNode n in myNodes) { String text = rm.GetString(n.Name); //And more things //... //... //... } } //... } 任何想法? 谢谢你 回答1 您的错误是c实际上是Control类型的变量,它没有Nodes成员。 您将需要将其TreeView为TreeView类型。 您可以执行以下两种方法之一: if (c is TreeView) { TreeNodeCollection myNodes = ((TreeView) c).Nodes; // <<--- Note the cast ... } 或者 TreeView tv = c as TreeView; if (tv != null) { TreeNodeCollection myNodes = tv.Nodes; ... } 回答2
  • 如何使用C#从Windows服务运行EXE程序?(How can I run an EXE program from a Windows Service using C#?)
    问题 如何使用C#从Windows服务运行EXE程序? 这是我的代码: System.Diagnostics.Process.Start(@"E:\PROJECT XL\INI SQLLOADER\ConsoleApplication2\ConsoleApplication2\ConsoleApplication2\bin\Debug\ConsoleApplication2.exe"); 当我运行此服务时,该应用程序未启动。 我的代码有什么问题? 回答1 这将永远行不通,至少在Windows Vista或更高版本中不行。 关键问题是您试图从Windows服务而不是标准Windows应用程序中执行此操作。 您显示的代码将在Windows Forms,WPF或控制台应用程序中完美运行,但在Windows Service中根本无法运行。 Windows Services无法启动其他应用程序,因为它们未在任何特定用户的上下文中运行。 与常规Windows应用程序不同,服务现在在隔离的会话中运行,并且禁止与用户或桌面进行交互。 这样就没有地方可以运行该应用程序。 这些相关问题的答案提供了更多信息: 引发Timer事件时,Windows Service如何启动进程? Windows中的哪个进程是特定于用户的? Windows服务(允许与桌面交互的服务) 到目前为止,您可能已经发现
  • 如何在ASP.NET 4.5中使用C#在转发器中使用linkbutton(How to use linkbutton in repeater using C# with ASP.NET 4.5)
    问题 在asp.net中,我在数据库中有一个表,其中包含问题,提交日期和答案。在页面加载时,仅出现问题。然后再次点击该链接,答案就消失了,就像点击时的扩大和缩小一样。 那么我应该在C#中使用什么编码呢? 回答1 我相信您可以处理Repeater的ItemCommand事件。 将一个LinkBut​​ton控件放置在您希望用户在“ Repeater”的项目模板中单击的链接上。 将此的CommandName属性设置为有意义的内容,例如“ ShowAnswers”。 另外,将Label或TextBox控件添加到Repeater的项目模板中,但在aspx标记中将其Visible属性设置为false。 在后面的代码中,在ItemCommand事件处理程序内,检查e.CommandName的值e.CommandName等于您的命令(“ ShowAnswers”)。 如果是这样,则在该Repeater项(可通过e.Item访问)中找到答案和日期的Label或TextBox控件。 找到它们后,将其Visible属性设置为true。 注意:您可以采用另一种方法来使用AJAX为用户提供更无缝的体验,但是这种方法一开始可能很容易实现。 我认为实现看起来像这样。 免责声明:我尚未测试此代码。 后台代码: void Repeater_ItemCommand(Object Sender
  • C#在更新时闪烁ListView(c# flickering Listview on update)
    问题 我有一个列表视图,该视图会定期更新(每60秒一次)。 每次过时我都会忽悠我,这使我很烦。 使用的方法是清除所有项目,然后重新创建它们。 我决定不清除要使用新文本直接写到单元格中的项目。 这是更好的方法还是任何人都有更好的解决方案。 回答1 ListView控件存在闪烁问题。 问题似乎是控件的Update重载未正确实现,因此其行为类似于Refresh。 更新应导致控件仅重绘其无效区域,而刷新应重绘控件的整个客户区。 因此,例如,如果要更改列表中一项的背景颜色,则仅需要对该特定项进行重新粉刷。 不幸的是,ListView控件似乎有不同的看法,并且每当您与单个项目打交道时都希望重绘其整个表面……即使该项目当前未显示。 因此,无论如何,您可以按照以下步骤滚动自己的图像来轻松抑制闪烁: class ListViewNF : System.Windows.Forms.ListView { public ListViewNF() { //Activate double buffering this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true); //Enable the OnNotifyMessage event so we get a chance to
  • 处理IE填写表格C#(Handle IE To filling a form c#)
    问题 我想浏览一个网站,通过我的应用程序登录并填写表单,而不会看到用户的任何东西,最后将其显示给用户进行提交。 以前,我使用webbrowser控件。 它通常可以正常工作,但有时,用户提交表单后会在网站上引发一些错误。 但在IE中,使用相同数据不会引发此错误。 有什么方法可以直接在IE中导航和填写我的数据的表单,然后将其显示给用户? (此站点有很多客户端控件,因此我必须等待对其数据做出响应(例如,在选择状态后加载城市) 回答1 您可以从C#应用程序自动化Internet Explorer实例。 首先,使用TlbImp.exe ieframe.dll创建互操作程序集SHDocVw.dll并将其添加为对项目的引用。 然后,使用以下代码创建Internet Explorer的进程外实例: var ie = (SHDocVw.WebBrowser)Activator.CreateInstance(Type.GetTypeFromProgID("InternetExplorer.Application")); ie.Visible = true; ie.Navigate("http://www.example.com"); 以与使用WebBrowser控件类似的方式使用它。 就是说,我相信您仍然可以使用托管的WebBrowser来实现所需的功能,只需实施功能控件以使其行为与IE相同