【问题标题】:Read and Save Location of a Form in c sharp在 c 中读取和保存表单的位置
【发布时间】:2021-01-17 15:55:14
【问题描述】:

我想读取文本文件的位置,因此当我重新打开表单时,它应该位于我上次关闭它的位置。有什么办法吗?

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

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());
}

【问题讨论】:

标签: c# .net winforms


【解决方案1】:

如果文件存在,则从构造函数中的文件中获取值读取数据获取 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","")));
            }
 }

【讨论】:

  • 是的.. 虽然这可能不是最好的\推荐的方法,但它是一个直截了当的答案(考虑到 OP 用于编写内容的实现)。本质上,它解决了\回答如何以及在何处解析this.Location.toString(),因为它已写入文件。
【解决方案2】:

鉴于您的样本和方法,您最初可能正在寻找的答案由@sai kiran 提供。

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

鉴于您以这种方式存储 Location Point 值(而不是 Point 的序列化形式)并且为了达到您想要的结果,您需要读取该文件并解析\处理字符串表示的值,从中构造一个新的Point类型实例,然后在窗体显示之前将其赋值给Location

对于这个ToString 字符串表示Point(我知道)有NO标准Point.Parse 方法,因此您必须通过字符串操作和外推。 注意:如果表示为"0, 0",可以反序列化为Point类型实例


话虽如此,您可以通过使用应用程序设置和控制属性绑定来完成此任务,而无需专门实现文件\流读取\写入或解析字符串的外插值>.

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

您将在用户范围中将设置(例如"Form1LocationPointUserSetting")定义为System.Drawing.Point由于Point是一个值类型,它会有一个默认值——(0, 0)

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

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

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

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            FormClosing += Form1_FormClosing;
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            //Save Settings
            Properties.Settings.Default.Save();
        }
    }

【讨论】:

    【解决方案3】:

    尝试改变

    File.Create(path);
    

    File.Create(path).Close();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-06
      相关资源
      最近更新 更多