我有一个带有一个按钮的Windows应用程序,并希望它是自动的,即运行任务计划程序而不是手动按下按钮。我这样做的时候会收到这个错误。索引超出了数组的范围。
这是我的代码。
private void button1_Click(object sender, EventArgs e)
{
this.Process1();
}
public void Process1()
{
dialog = new SaveFileDialog();
dialog.Title = "Save file as...";
dialog.Filter = "XML Files (*.xml)|*.xml";
dialog.RestoreDirectory = true;
//dialog.InitialDirectory = @"v:\";
//blah blah blah...... code here..
}
点** ** rogram.cs
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//Application.Run(new Form1());
Form1 form = new Form1();
String[] arguments = Environment.GetCommandLineArgs();
if (arguments.Count() >= 1)
{
// next line shows up the error
Int16 valueArgument = Int16.Parse(arguments[1]);// <---
switch(valueArgument)
{
case 1 :
form.Process1();
break;
}
}
// ...
这适用于另一个带有11个按钮的应用程序。这里我只有一个按钮可以运行但失败了。
答案 0 :(得分:1)
如果您有1个参数,则arguments[1]
将不存在。要获得第一个参数,请使用arguments[0]
。
正如@ActiveHigh在评论中指出的那样,第一个参数将始终是正在执行的程序的文件名(请参阅Environment.GetCommandLineArgs文档中的备注部分。
这意味着您没有传递命令行参数。它还建议您将参数计数检查更新为&gt; 1而不是&gt; = 1,因为这个条件总是为真。
答案 1 :(得分:0)
您的程序有很多错误。我尽可能地指出了 -
Windows Form Application
与Console Application
的工作方式不同。对于控制台,一旦退出Main,程序将退出。这就是您的代码中现在发生的事情。要使Windows窗体应用程序无限期运行,您必须从Application.Run
获取帮助,我看到您已注释掉了。所以程序将运行并退出。
第二个错误是 -
String[] arguments = Environment.GetCommandLineArgs();
,arguments
是一个数组,因此它没有Count()
方法。您应该使用arguments.Length
您必须致电ShowDialog
以显示对话框。
如果你想要一些工作,你必须至少解决这个问题。更好,而不是使用main方法,将所有参数传递给表单,然后在表单中执行任何操作 -
表格 -
public Form1()
{
InitializeComponent();
this.Shown += (s, e) => {
String[] arguments = Environment.GetCommandLineArgs();
if (arguments.Length > 1)
{
Int16 valueArgument = Int16.Parse(arguments[1]);
switch (valueArgument)
{
case 1:
this.Process1();
break;
}
}
};
}
private void button1_Click(object sender, EventArgs e)
{
this.Process1();
}
public void Process1()
{
var dialog = new SaveFileDialog();
dialog.Title = "Save file as...";
dialog.Filter = "XML Files (*.xml)|*.xml";
dialog.RestoreDirectory = true;
dialog.ShowDialog(this);
//dialog.InitialDirectory = @"v:\";
//blah blah blah...... code here..
}
和Program.cs -
static class Program
{
[STAThread]
static void Main()
{
var handleCreated = new ManualResetEvent(false);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
另请注意 - Application.Run是一个阻止调用。编写任何代码 此调用之后只会在调用的表单退出后执行。