我有一个控制台应用程序,可以使用google工作表API从电子表格中检索数据。使用Windows调度程序每5分钟运行一次,即可自动运行此应用程序。
在同一个解决方案中,我创建了一个可以在自动化过程之外手动运行的Windows窗体项目,以调整任何设置而不会干扰5分钟的过程。
(即如果我们想要更改电子表格ID以从不同的电子表格中获取数据,或者如果我想更改数据获取位置的输出文件夹)
我正在尝试开发一个表单项目,该项目将在同一解决方案中编辑另一个项目的“settings.settings”文件。下面是我如何解决问题的截图:
我已经在我的SettingsUI项目中添加了来自sheetstocsv项目的引用,并且我已经成功创建了一个访问sheetstocsv设置的表单,并在单击保存按钮时对其进行编辑。下面显示的是应该从表单中保存新设置的功能。
private void Save_Button_Click(object sender, EventArgs e)
{
sheetstocsv.Properties.Settings.Default.outputdir = OutputDirectory_TextBox.Text;
sheetstocsv.Properties.Settings.Default.spreadsheetID = SpreadsheetID_Textbox.Text;
sheetstocsv.Properties.Settings.Default.Entity = Entity_Texbox.Text;
sheetstocsv.Properties.Settings.Default.headernum = (int)Columns_NumericUpDown.Value;
string headers = "";
for (int i = 0; i < (int)Columns_NumericUpDown.Value; i++)
{
headers = headers + Columns_DataGridView.Rows[0].Cells[i].Value.ToString() + ",";
}
sheetstocsv.Properties.Settings.Default.headers = headers;
sheetstocsv.Properties.Settings.Default.configured = true;
sheetstocsv.Properties.Settings.Default.Save();
MessageBox.Show("Saving Complete!", "Settings",
MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
下面是一个代码片段,说明如果配置文件首先配置了sheetstocsv项目我将如何继续
//Check for if configured
if (Properties.Settings.Default.configured == false)
{
Console.WriteLine("Program has not been configured yet! Please Run SettingsUI first to start this program.");
Console.ReadLine();
Environment.Exit(0);
}
每当我运行settingsUI,保存,然后运行我的sheetstocsv项目时,应该保存的更改不会。它不会让程序向前移动。
下面是完整表单.cs,显示了我如何编辑其他项目的属性
using sheetstocsv;
namespace SettingsUI
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Columns_DataGridView.RowCount = 1;
Columns_DataGridView.ColumnCount =(int)Columns_NumericUpDown.Value;
}
// Event handlers for other UI elemets here.......
private void Save_Button_Click(object sender, EventArgs e)
{
sheetstocsv.Properties.Settings.Default.outputdir = OutputDirectory_TextBox.Text;
sheetstocsv.Properties.Settings.Default.spreadsheetID = SpreadsheetID_Textbox.Text;
sheetstocsv.Properties.Settings.Default.Entity = Entity_Texbox.Text;
sheetstocsv.Properties.Settings.Default.headernum = (int)Columns_NumericUpDown.Value;
string headers = "";
for (int i = 0; i < (int)Columns_NumericUpDown.Value; i++)
{
headers = headers + Columns_DataGridView.Rows[0].Cells[i].Value.ToString() + ",";
}
sheetstocsv.Properties.Settings.Default.headers = headers;
sheetstocsv.Properties.Settings.Default.configured = true;
sheetstocsv.Properties.Settings.Default.Save();
MessageBox.Show("Saving Complete!", "Settings", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
}
}
答案 0 :(得分:0)
我的问题中没有足够的信息(请参阅Rufus的评论),但我猜你的控制台应用程序会启动你的WinForm?如果是这种情况,可能发生的是:
1)控制台应用程序启动,并将配置文件加载到内存中。 2)您的Winform启动并更改配置文件。 3)控制台应用程序在退出时覆盖对配置文件的更改,因为它在更改之前读取它。
您可以将winform移动到控制台项目中,然后执行以下操作:
Properties.Settings.Default.outputdir = OutputDirectory_TextBox.Text;
...
添加更多信息(10月1日):
我必须诚实,做你正在做的事情有点奇怪,我真的会重新考虑引用可执行文件来改变它的默认设置。仅仅因为VS让你这样做,并不一定意味着你应该这样做。但如果必须,还可以尝试其他一些事项:
1)您可以简单地解析xml设置文件并更改要更改的设置的节点值。 System.Xml命名空间将非常简短。以下帖子有很好的例子:
2)尝试使用控制台项目中的某个方法包装当前位于按钮单击事件处理程序中的代码。这样,您就可以调用更改设置的方法,而不是尝试从外部程序集更改设置。
注意:如果您的控制台应用程序正在运行,而您正在对其配置文件进行更改,那么这些方法都不会起作用。在关闭时,控制台应用程序将使用在启动时加载到内存中的设置覆盖设置文件。如果控制台应用程序没有运行,1)肯定会有效。