C# 如何检测配置被修改过

cn_qdd 2017-05-30 09:31:02
我的程序里有一个“选项”对话框,该对话框里包含有许多设置,我以XML形式保存。
我想问: 当某一次我仅仅更换一个设置时(如:更换了一个TextBox里值由1变为2),点击对话框保存时,我如何判断在从多设置里,我只更换了TextBox的值,又该如何只对XML里相应部分修改,而不是把对话话框里所有的值都重新写入一次。

困扰了我一段时间了! 谢谢大神们!
...全文
445 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2017-06-02
  • 打赏
  • 举报
回复
引用 1 楼 wtuqi 的回复:
既然是XML就能绑定dataTable的,
既然绑定了DataTable就能用Getchangs属性获取变化状态,
既然用了DataTable就不担心按列按行更新数据了,很多新手问的问题都是一串的,
下面你可能问到的是
1怎么绑定到datatable,
2.怎么使用Getchangs属性
3.怎么更新
你最好还是涿个百度一下,这些问题回答得太频繁了,CSDN很多了


这几天把您说的方法学习了一遍,我现在可以将 xml 读取到 DataSet 的某个 DataTable里,目前 Advance 这个DataTable 里有这样的记录:

与此 DataTable 的关系的 xml 片段:


我想将 TextBox1 的Text 与 表中的 Rows[0][“Cycle”] 这个单元进行绑定,这样单元格内容就可以随着 TextBox1 的内容发生变化了,该如何实现?
TextBox1.DataBindings.Add ("Text“, dataSet.Tables["Advance"], "Cycle") -> 这种形式是把整个列都绑定了吧。
TextBox1.DataBindings.Add("Text", dataSet.Tables["Advance"].Rows[0], "Cycle") ->这种写法不对。
尝试了多种写法基本都是说,第三个参数指定的属性或列不存在。

TextBox1的Text 属性是无法绑定表里的单元格吗? 还是我概念理解的有问题? 请指点,非常感谢!
hljhyb 2017-06-01
  • 打赏
  • 举报
回复
那你定义一个List<string>,每个设置修改完就add一下,到时候直接判断list就好了
「已注销」 2017-06-01
  • 打赏
  • 举报
回复
引用 15 楼 hljhyb 的回复:
我就是给你提个小小的建议,为什么不用C#本身的设置。你可以把每个设置文字框的名字设置成和设置名一致。 然后把设置文字框放在一个groupbox里,然后
foreach (Control vControl in groupBox1.Controls)
                {
                    if (vControl is TextBox)
                    {
                        Properties.Settings.Default[vControl.Name] = vControl.Text;
                    }
                }
这样不是很方便吗?
之前我也是遍历的,但当控件数量(或设置的值)多的时候,非常麻烦,毕竟大多数时改的就一二个设置,所以在想找到一个不遍历的方法。
hljhyb 2017-06-01
  • 打赏
  • 举报
回复
我就是给你提个小小的建议,为什么不用C#本身的设置。你可以把每个设置文字框的名字设置成和设置名一致。 然后把设置文字框放在一个groupbox里,然后
foreach (Control vControl in groupBox1.Controls)
                {
                    if (vControl is TextBox)
                    {
                        Properties.Settings.Default[vControl.Name] = vControl.Text;
                    }
                }
这样不是很方便吗?
「已注销」 2017-06-01
  • 打赏
  • 举报
回复
引用 13 楼 xuzuning 的回复:
C# 提供了 XML序列化 功能,所以将一个对象序列化成 XML,和将 XML 反序列化成对象。是很简单的事情,并不需要什么遍历
C# 提供了 数据绑定 功能,可在任意两个对象间做数据绑定
比如将对象 A 的 name 属性绑定到 texyBox1 就写作
textBox1.DataBindings.Add("Text", A, "name", false, DataSourceUpdateMode.OnPropertyChanged);
由于有 DataSourceUpdateMode.OnPropertyChanged 的作用
对 textBox 的任何修改,都会立即反应到 A.name 上。
至于向 xml 文件写一个与它完全相同的内容,也并非大逆不道的事情
因此并无必要去检查内容是否被修改了


我从 xml 中读取到了一个 DataTable中


引用 13 楼 xuzuning 的回复:
C# 提供了 XML序列化 功能,所以将一个对象序列化成 XML,和将 XML 反序列化成对象。是很简单的事情,并不需要什么遍历
C# 提供了 数据绑定 功能,可在任意两个对象间做数据绑定
比如将对象 A 的 name 属性绑定到 texyBox1 就写作
textBox1.DataBindings.Add("Text", A, "name", false, DataSourceUpdateMode.OnPropertyChanged);
由于有 DataSourceUpdateMode.OnPropertyChanged 的作用
对 textBox 的任何修改,都会立即反应到 A.name 上。
至于向 xml 文件写一个与它完全相同的内容,也并非大逆不道的事情
因此并无必要去检查内容是否被修改了


我把 xml 文件内容读取到了 DataSet 中,其中有一个名为 Advance 的 DataTable:

与其对应的 xml 片段为:


我该如何将 TextBox1的Text值与 Advance 表中的某一个Cell(或单元格)绑定,如想与 Row[0][0] 绑定?
TextBox1.DataBinding.Add ( "Text", dataSet.Tables["Advance“], "Cycle") ,这样是绑定一列数据吧,而非一个单元格数据。
TextBox1.DataBinding.Add ( "Text", dataSet.Tables["Advance“].Rows[0], "Cycle") -> 这样写不对,提示找不到 Cycle属性值。

我是想,改变 TextBox1 的Text的值时, Rows[0][0]的值也会变化。
请教,多谢! 是不是我概念理解错了?
zbdzjx 2017-05-31
  • 打赏
  • 举报
回复
引用 11 楼 cn_qdd 的回复:
[quote=引用 8 楼 zbdzjx 的回复:] WinForm?还是网页?
是WinForm的。 就像,VS->工具->选项对话框一样。 有那么选项,例如某一次你仅更改了一个选项的值,有什么好办法,可以知道你更改了哪一个选项,然后去更新 xml 文件里对应的值? 我之前的作法,都是全部遍历所有控件的值,再重新写入一遍 xml 文件。 这样做,选项少的时候还可,选项多的时候,非常麻烦。 我在尝试用 @1楼 的办法![/quote] 一个投机取巧的办法,就是将原值存到tag中。保存时,遍历所有控件,判断一下tag中的值和现在的值是否一样,如不一样,就保存。
「已注销」 2017-05-31
  • 打赏
  • 举报
回复
引用 8 楼 zbdzjx 的回复:
WinForm?还是网页?
是WinForm的。 就像,VS->工具->选项对话框一样。 有那么选项,例如某一次你仅更改了一个选项的值,有什么好办法,可以知道你更改了哪一个选项,然后去更新 xml 文件里对应的值? 我之前的作法,都是全部遍历所有控件的值,再重新写入一遍 xml 文件。 这样做,选项少的时候还可,选项多的时候,非常麻烦。 我在尝试用 @1楼 的办法!
正怒月神 2017-05-31
  • 打赏
  • 举报
回复
听起来更像是 mvvm模式的 前台双向绑定。INotifyPropertyChanged?
wang_peng_yl 2017-05-31
  • 打赏
  • 举报
回复
从技术上讲,不可能只保存一部分的,必需全部保存,xml怎么说他也是个文件,除非是linux系统,有这样的指令 从业务上讲,你怎么就知道操作者只修改这一项呢,除非界面里就这一项,那就没办法。
zbdzjx 2017-05-31
  • 打赏
  • 举报
回复
WinForm?还是网页?
xuzuning 2017-05-31
  • 打赏
  • 举报
回复
C# 提供了 XML序列化 功能,所以将一个对象序列化成 XML,和将 XML 反序列化成对象。是很简单的事情,并不需要什么遍历 C# 提供了 数据绑定 功能,可在任意两个对象间做数据绑定 比如将对象 A 的 name 属性绑定到 texyBox1 就写作 textBox1.DataBindings.Add("Text", A, "name", false, DataSourceUpdateMode.OnPropertyChanged); 由于有 DataSourceUpdateMode.OnPropertyChanged 的作用 对 textBox 的任何修改,都会立即反应到 A.name 上。 至于向 xml 文件写一个与它完全相同的内容,也并非大逆不道的事情 因此并无必要去检查内容是否被修改了
  • 打赏
  • 举报
回复
如果说你提出自己的设计,然后说明到底有什么技术问题,这还比较靠谱。如果一点都不自己动手,凡事都来抄一个代码,那还是不要 csdn 比较好。
水哥阿乐 2017-05-30
  • 打赏
  • 举报
回复
既然是XML就能绑定dataTable的, 既然绑定了DataTable就能用Getchangs属性获取变化状态, 既然用了DataTable就不担心按列按行更新数据了,很多新手问的问题都是一串的, 下面你可能问到的是 1怎么绑定到datatable, 2.怎么使用Getchangs属性 3.怎么更新 你最好还是涿个百度一下,这些问题回答得太频繁了,CSDN很多了
  • 打赏
  • 举报
回复
先“提出自己的设计,然后说明到底有什么技术问题”,请不要故意看不懂这个要求,这是任何一个技术论坛的最基本的提问的要求。有些论坛甚至为此要求会员定期回答几十个问题来验证会员有一些起码的门槛。
  • 打赏
  • 举报
回复
引用 3 楼 cn_qdd 的回复:
@2楼大神,无需讥讽,我本非专业,也本不是为获取些代码。仅是想获取一些思路,之前都是遍历所有控件的值再写入到文件,但总觉得有其它方式。
你自己看看你的描述,哪里事先说明你的设计了?随便想起几行代码都要“求思路”,这本来就把 csdn 这种论坛毁了。
xuzuning 2017-05-30
  • 打赏
  • 举报
回复
没有比较就没有鉴别 如果你没有保存修改前的值,就无法知道是否被修改了 你可在向 TextBox.Text 赋值的同时,在 TextBox.Tag 中保存副本 XML 是结构化文档 你可以只修改 XML 的某个节点,但不可只修改 XML 文件的一部分(需要全部重写)
糖君二少 2017-05-30
  • 打赏
  • 举报
回复
你可以再加入一个设置项,用来存储最近被更改的项目,这样读取设置的时候,首先读取这一部分。比方说: 用ABCD表示四个设置项,用E表示ABCD哪些被最近更改过,读取的时候,先读取E,然后根据E的内容去读取ABCD之中的一部分。
「已注销」 2017-05-30
  • 打赏
  • 举报
回复
@2楼大神,无需讥讽,我本非专业,也本不是为获取些代码。仅是想获取一些思路,之前都是遍历所有控件的值再写入到文件,但总觉得有其它方式。

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧