如何自动保存用户更改

时间:2016-02-08 06:29:17

标签: c# winforms

如何在Windows窗体中自动保存验证部件,

例如,在Windows窗体页面中,如果用户进行更改,我有一个名为validation的标签控件

即,选中复选框并更改颜色框,所有更改都应自动保存而不点击保存按钮?

4 个答案:

答案 0 :(得分:1)

自动保存操作非常复杂。因为它会在自动保存时中断用户活动。一种实现自动保存的简单方法

  1. 创建一个Timer和Boolean标志变量。

  2. 应用程序启动时启动计时器。

  3. 如果用户活动进行了任何更改,请设置标记。

  4. 根据定时器间隔频繁调用自动保存功能。如果设置了标志,则保存完整的应用程序更改 重置标志。

答案 1 :(得分:0)

您可以向这些控件添加事件侦听器/处理程序,并在进行任何更改时调用您保存控件内容的Save方法。

例如:

private void CheckBox1_CheckedChanged(Object sender, EventArgs e) {
    CheckBox cb1 = (CheckBox)Gridview.Rows[index].FindControl("CheckBox1");
    string checkboxstatus;
    if (cb1.Checked == true)
        checkboxstatus = "YES";
    else if(cb1.Checked == false)
        checkboxstatus = "NO";
   SaveData(checkboxstatus); // or something similar where you send the  data to a method that will actually perform the save operation

}

答案 2 :(得分:0)

首先,如果您自动保存,为什么还需要保存按钮? 其次,你可能想看看" Dirty"检查您所在的表格以查看字段是否有变化。

您可以创建自己的库来检查/实现此功能,但也有一些示例:First exampleSecond example

答案 3 :(得分:0)

您可以像Mamta D所建议的那样执行相同的操作,除非生成表单时为每种类型的控件创建处理程序并为处理程序订阅所有相关控件。之后,您可以处理保存过程。

如果没有看到你的代码是如何生成的那样,很难真正建议这样做的万无一失的方法,但是我会给你一个机会。

预警 - 我正在工作,这段代码可能会出现问题'因为我无法编译和测试。从臀部开始射击。此外,我还没有处理将控件分配给容器或类似的东西。你必须自己解决这个问题。

您可以通过几种方法在动态事件处理程序上创建自己的逻辑'在创建时,使用匿名委托并处理如下事件:

var cb = new CheckBox();    

cb.CheckedChanged += (sender, e) => 
{
        // handle your saving logic here
};

或者你可以在它生成后执行它并隐式创建一个处理程序来处理表单中的所有复选框,如下所示:

var cb = new CheckBox();
cb.CheckedChanged += new EventHandler(cb_CheckedChanged);

private void cb_CheckedChanged(object sender, EventArgs e)
{
  //handle your checking and saving logic here.
}

现在,如果您担心数据来自哪里,并且需要将其保存到特定位置,那么每个复选框都与产品相关联[&p;并且复选框指定产品仍在库存的位置,然后您需要动态应用cb.Name = "nameHere"的名称并使其有意义,以便您可以在事件处理程序中进行检查。

使用第二个例子:

   private List<Product> _products = new List<Product>();
   _products.Add(new Product("Product_1"));
   _products.Add(new Product("Product_2"));


   //Before anybody gets antsy in their pantsy, I know the above is syntactically incorrect
   //It's for illustrative purposes only


    private void Generate() 
    {
        for (int i = 0; i < _products.Count(); i++) 
        {
            var cb = new CheckBox(); 
            cb.Name = _products[i].Name; //make it something generic like above, it'll help you check it

            cb.CheckedChanged += new EventHandler(cb_CheckedChanged);
        }
    }

    private void cb_CheckedChanged(object sender, EventArgs e)
    {
       var cBox = sender as CheckBox;
       if(cBox.Name == "Product_1")
           //handle business
    }

现在这很丑陋(非常),如果它冒犯了你的一些眼睛我道歉 - 这纯粹是说明性的。

这允许您根据复选框的名称处理逻辑并相应地处理它。您可以在第二个示例中执行相同的操作 - 如果您需要区分复选框,我的建议是 - 但如果所有逻辑都相同,则第一个选项更清晰。

这两个选项都有效,它们都假设您能够修改创建代码。有一种方法可以通过reflection / linq来处理它,而无需处理调整你的创建代码,但是如果你正在努力解决这个问题,你可能会更好地理解发生的事情背后的逻辑。在采取&#34;快捷方式&#34;。

之前

希望这有帮助,如果我误解了我的道歉的问题。上面的代码由于语法原因不会编译,但您可以轻松调整它以确保它(只需要修复一个点)。它很脏,但为了向你展示你需要做什么,你需要做的是根据动态生成的控件发出的事件来检查和处理变更的保存逻辑 - 它很好地服务于它。 / p>

古德勒克