C# 在c语言中读取并保存表单的位置

C# 在c语言中读取并保存表单的位置,c#,.net,winforms,C#,.net,Winforms,我想读取文本文件的位置,所以当我重新打开表单时,它应该在我上次关闭它的位置。有办法吗 我要写入文本文件的代码: string path = Directory.GetCurrentDirectory() + @"\config\Loc\dateloc.txt"; if (!File.Exists(path)) { File.Create(path); } try { System.IO.File.WriteAllBytes(path, new byte[0

我想读取文本文件的位置,所以当我重新打开表单时,它应该在我上次关闭它的位置。有办法吗

我要写入文本文件的代码:

string path = Directory.GetCurrentDirectory() + @"\config\Loc\dateloc.txt";

if (!File.Exists(path))
{
    File.Create(path);
}

try
{
    System.IO.File.WriteAllBytes(path, new byte[0]);
    StreamWriter writer = new StreamWriter(path, true);
    string overlayloc = this.Location.ToString();
    writer.WriteLine(overlayloc.ToString());
    writer.Dispose();
    writer.Close();
}
catch (Exception ex)
{
    MessageBox.Show(ex.ToString());
}
试着改变

File.Create(path);


从构造器中的文件中获取值如果文件存在读取数据获取x y位置并分配到位置抱歉第一眼看不懂您的问题我希望现在就可以了

public Form1()
 {
            InitializeComponent();
            string path = Environment.CurrentDirectory + @"\config\dateloc.txt";
            if (File.Exists(path))
            {
                string loc = File.ReadAllText(path);
                this.Location = new Point(Int32.Parse(loc.Split(',')[0].Replace("{X=", "")), Int32.Parse(loc.Split(',')[1].Replace("Y=", "").Replace("}\r\n","")));
            }
 }

根据您的示例和方法,您最初可能寻找的答案是@sai kiran提供的

也就是说,您正在执行
Form.Location
ToString()
(这是一种
System.Drawing.Point
类型)并将其写入方法中的文件中。注意:
ToString()
的输出字符串是
(X=?,Y=?)
,其中
是表示值的数字字符

考虑到您正以这种方式存储
位置
值(而不是
的序列化形式),并且为了获得所需的结果,您需要读取该文件并解析\处理字符串表示的值,从中构造一个新的
类型实例,然后在显示表单之前将其分配到
位置

没有标准的
点。解析
点的
字符串表示形式的
方法(我知道),因此您必须通过字符串操作和外推来处理它。注意:如果它表示为
“0,0”
,则可以将其反序列化为
类型实例


话虽如此,您可以通过使用应用程序设置和控件属性绑定来完成此任务,而无需专门实现File\Stream reads\writes,也无需解析字符串的外推值

实际上,使用应用程序设置和属性绑定是我推荐的方法和答案。我将提供一些关于这方面的指导:

设置定义为用户范围内的
系统.Drawing.Point
(例如
“Form1LocationPointUserSetting”
)。由于
是一种值类型,它将有一个默认值-
(0,0)

您可以通过几种方式定义设置,但最简单的方法可能是使用IDE的设置设计器工具(它将生成代码并更新App.config)

保存设置设计器更改(使用CTRL+S保存全部)后,您将能够以编程方式在代码中引用设置属性名称,并在控件属性绑定中使用它(因为它与属性类型相关)。注意:并非所有控件属性都以这种方式支持绑定,并且一些支持绑定的控件属性可能不会使用
INotifyProperty
更改实现\update

最后,您需要保留对设置所做的任何更改。因此,您将在某些事件期间调用
Property.Settings.Default.Save()
。(例如表单关闭事件。)

公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
FormClosing+=Form1\u FormClosing;
}
私有作废Form1\u FormClosing(对象发送方,FormClosingEventArgs e)
{
//保存设置
Properties.Settings.Default.Save();
}
}

为什么要开始在该文件中写入一个字节?如果文件不存在,StreamWriter也会创建该文件。最后,您在追加模式下写入,您在该文件中写入的位置是否比当前表单中的位置多?首先,您必须确定\澄清此设置是特定于应用程序、计算机还是用户,然后还要确定它是否特定于控件。基本上,什么范围?
visual-studio-2019
← 除非您对此特定版本有特定问题,否则不要使用此标记。这是否回答了您的问题?以及有关CodeProject使用应用程序设置和Visual Studio RAD设计器的教程:是的。。尽管这可能不是最好的\推荐的方法,但这是一个直截了当的答案(考虑到OP编写内容的实现)。本质上,它解决\回答了如何以及在何处解析
this.Location.toString()
,因为它是写入文件的。
public Form1()
 {
            InitializeComponent();
            string path = Environment.CurrentDirectory + @"\config\dateloc.txt";
            if (File.Exists(path))
            {
                string loc = File.ReadAllText(path);
                this.Location = new Point(Int32.Parse(loc.Split(',')[0].Replace("{X=", "")), Int32.Parse(loc.Split(',')[1].Replace("Y=", "").Replace("}\r\n","")));
            }
 }