我一直在阅读很多关于如何从C#程序(Process.Start())中触发应用程序的内容,但是我还没有找到有关如何在我的C#程序面板中运行这个新应用程序的任何信息.例如,我想点击一下按钮,在我的应用程序中打开notepad.exe,而不是外部打开.
我试过制作(我的第一个)C#程序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("hello");
Console.ReadLine();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这很顺利,但如果我尝试使用System.Windows.Forms:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("hello");
System.MessageBox("hello");
Console.ReadLine();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
Error 1 The type or namespace name 'Windows' does not exist in the namespace 'System' (are you missing an assembly reference?) C:\Users\Ramy\Documents\Visual Studio 2010\Projects\ConsoleApplication1\ConsoleApplication1\Program.cs 5 14 …Run Code Online (Sandbox Code Playgroud) 我正在构建一个应用程序,其中所有键输入必须由Windows本身处理.
我为每个控件设置了tabstop为false,除了一个面板之外,女巫可以抓住焦点(但我不知道它是否有效).
我将KeyPreview设置为true,我正在处理此窗体上的KeyDown事件.
我的问题是,有时箭头键不再响应:
当我只按箭头键时,不会触发keydown事件.
如果我按下带有控件修饰符的箭头键,则会触发keydown事件.
你知道我的箭头键突然停止发射事件的原因吗?
我正在使用以下代码行Image从文件中打开:
pictureBox1.Image = Image.FromFile("test.png");
Run Code Online (Sandbox Code Playgroud)
我希望它能锁定文件,将图像加载到内存中,设置pictureBox1.Image为内存中的副本,然后释放锁定.在现实中,锁不会消失,直到我Dispose()的Image记忆.我无法释放我不再使用的硬盘上的文件锁,直到我删除了我正在使用的内存中的文件.
微软的网站在一篇带有C#标签的文章中提及它,但他们的解决方案是用visual basic编写的,这对我来说毫无用处.
总结:我想设置pictureBox1.Image存储的图像"test.png",然后让用户编辑或删除"test.png"或其他.
我需要强制DataGridView显示所选row.
简而言之,我有一个根据键入的内容textbox更改DGV选择textbox.发生这种情况时,选择会更改为匹配row.
不幸的是,如果所选row内容不在视图中,我必须手动向下滚动才能找到所选内容.有谁知道如何强制DGV显示所选row?
谢谢!
我的程序调用Java,然后将stdout重定向到a RichTextBox.我的问题是,每次写入数据时,垂直滚动条始终位于框的顶部.
即使您滚动到底部,一旦写入新数据,它就会转到顶部.我想反其道而行之.
因此,当写入新数据时,它会保持在底部.我怎样才能做到这一点?
我有一个生成BackgroundWorker的表单,它应该更新表单自己的文本框(在主线程上),因此Invoke((Action) (...));调用.
如果HandleClosingEvent我只是做bgWorker.CancelAsync()然后我得到ObjectDisposedException的Invoke(...)电话,可以理解.但是,如果我坐在那里HandleClosingEvent等待bgWorker完成,那么.Invoke(...)永远不会返回,也是可以理解的.
任何想法如何关闭此应用程序而不会出现异常或死锁?
以下是简单Form1类的3个相关方法:
public Form1() {
InitializeComponent();
Closing += HandleClosingEvent;
this.bgWorker.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {
while (!this.bgWorker.CancellationPending) {
Invoke((Action) (() => { this.textBox1.Text = Environment.TickCount.ToString(); }));
}
}
private void HandleClosingEvent(object sender, CancelEventArgs e) {
this.bgWorker.CancelAsync();
/////// while (this.bgWorker.CancellationPending) {} // deadlock
}
Run Code Online (Sandbox Code Playgroud) 我的表单上有一个datagridview,我填充它:
dataGridView1.DataSource = students.Select(s => new { ID = s.StudentId, RUDE = s.RUDE, Nombre = s.Name, Apellidos = s.LastNameFather + " " + s.LastNameMother, Nacido = s.DateOfBirth })
.OrderBy(s => s.Apellidos)
.ToList();
Run Code Online (Sandbox Code Playgroud)
现在,我使用s.Apellidos作为默认排序,但我也想允许用户在单击列标题时进行排序.
这种排序不会以任何方式修改数据,它只是一个客户端奖励,以便在用眼睛扫描屏幕时更容易搜索信息.
谢谢你的建议.
找到当前在WinForms中接收用户(键盘)输入的控件的首选/最简单方法是什么?
到目前为止,我已经提出以下建议:
public static Control FindFocusedControl(Control control)
{
var container = control as ContainerControl;
return (null != container
? FindFocusedControl(container.ActiveControl)
: control);
}
Run Code Online (Sandbox Code Playgroud)
从表单中,可以简单地称为(在.NET 3.5+中甚至可以将其定义为表单上的扩展方法) -
var focused = FindFocusedControl(this);
Run Code Online (Sandbox Code Playgroud)
这个合适吗?
是否有我应该使用的内置方法?
请注意,使用层次结构时,单次调用ActiveControl是不够的.想像:
Form
TableLayoutPanel
FlowLayoutPanel
TextBox (focused)
Run Code Online (Sandbox Code Playgroud)
(formInstance).ActiveControl将返回对TableLayoutPanel的引用,而不是TextBox(因为ActiveControl似乎只是在控制树中返回直接活动的子节点,而我正在寻找叶子控件).
当控件可能在其他控件(如Panel)中时,有没有办法检索控件在窗体中的位置?
控件的Left和Top属性只给出了它在父控件中的位置,但如果我的控件位于五个嵌套面板中,我需要它在窗体上的位置怎么办?
快速举例:
按钮btnA位于面板pnlB内的坐标(10,10)上.
面板pnlB位于形式frmC内的坐标(15,15)上.
我想要btnA在frmC上的位置,这是(25,25).
我可以获得这个位置吗?