2009-08-05 64 views
0

保持一个DataSet,我在一个内部Web应用程序转换为的winform应用断开连接的原因的过程中,我打下面的障碍。试图在winform应用程序

Function SaveMe()上的Web应用程序存在Person.ascx.vb页面下面的代码 - >

 //get dataset from session 
     Dim dsPerson As Data.DataSet = CType(Session.Item("Person" & Me.UniqueID), DataSet) 
     //if no rows in dataset, add 
     If dsPerson.Tables(0).Rows.Count = 0 Then 
      Dim rowPerson As Data.DataRow = dsPerson.Tables(0).NewRow 
      dsPerson.Tables(0).Rows.Add(FillPersonRow(rowPerson)) 
     Else 
     //otherwise update 
     ....more code here 

我坚持上的部分是如何在逻辑上一个WinForm应用程序创建一个数据集?

如果我只是凑的所有字段,扔一个DataSet?如何(这是我将研究/时尝试从SO等待咨询)?


编辑

是越来越创建会话/填充在LoadMe()子,像这样 - >

 //load person 
     Dim dsTemp As Data.DataSet = BLL.Person.GetPerson(PersonID) 
     //save to session state 
     Session.Add("Person" & Me.UniqueID, dsTemp) 

编辑

我我要做的是创建一个表单级的变量 - >private DataSet _personInfo;持有的数据集,然后在我的FormPaint(int personID)我所说的以下内容:

  _personInfo = ConnectBLL.BLL.Person.GetPerson(personID); 

然后我用它来填充表单上的各个领域。

接下来,btnUpdate_Click()我尝试以下方法,但无济于事:

 void btnUpdate_Click(object sender, EventArgs e) 
    { 
     var areChanges = _personInfo.HasChanges(); 
     if (areChanges) 
     { 
      var whatChanged = _personInfo.GetChanges(); 
      var confirmChanges = 
       MessageBox.Show(
        "Are you sure you want to make these changes: " + 
        whatChanged.Tables[0].Rows[0].ItemArray.ToString(), "Confirm Member Info Changes", 
        MessageBoxButtons.YesNo, MessageBoxIcon.Hand); 
      if (confirmChanges == DialogResult.Yes) 
      { 
       _personInfo.AcceptChanges(); 
       ConnectBLL.BLL.Person.Update(_personInfo); 
      } 
     } 

     FormPaint(HUD.PersonId); 
    } 

我不清楚是什么,我做错了什么?我错过了一步吗?

谢谢

+0

当你完成它时,isChanges是否为false?如果是这样,那么您需要更新数据集中的值(手动或通过数据绑定)。 – 2009-08-05 22:42:14

+0

是的,它每次都是假的...... – 2009-08-06 00:23:46

回答

3

首先,

如果你想雅各募阅读下面的文章问题的一个很好的解释?

http://www.knowdotnet.com/articles/datasetmerge.html

而且我同意你似乎使它更难比它需要的其他人。

你不清楚ConnectBLL类是什么......是一个自定义的bizness对象或强类型的数据集。

要做数据绑定,将自动保存将是一个非常长的职位,以代替这是一对夫妇的链接。

http://www.codeguru.com/columns/vb/article.php/c10815
http://support.microsoft.com/kb/313482
http://msdn.microsoft.com/en-us/library/aa984336(VS.71).aspx

这些都是作为搜索字符串我在谷歌找到使用第一链接(一步一步的指令上的WinForms绑定一个强类型数据集)。你可能会找到一个更好的。 codeguru链接看起来不错。另一个更加彻底,而不是牺牲更多的技术。

最重要的是...如果你春天的克里斯·塞尔斯书的WinForms开发,数据绑定的章节是优秀的(与所有其他章节的一起。)

http://www.amazon.com/Windows-Forms-Programming-Microsoft-Development/dp/0321267966/ref=sr_1_1?ie=UTF8&qid=1249525202&sr=8-1

希望这帮助。

+0

如果没有别的东西,你会得到+1的正确搜索字符串,不管你信不信,它有时是新独立开发的最大障碍。 ConnectBLL是一个自定义的业务层。我认为我的问题与绑定有关。前一段时间,当我开始这个项目时,管间的一个人告诉我不要使用MS数据绑定,他总是使用他自己的。我现在意识到,我在不了解第二部分的情况下遵循了他的第一部分建议。感谢您花费一些时间处理一个明显的'newb'问题。 – 2009-08-06 03:09:51

+0

为了直接将你的商业对象绑定到用户界面上,商业对象必须实现某些界面......在Chris Sells书中很好地解释了这一点。数据绑定可以是松鼠,但是当它工作时,它可以工作。想象一下,这样做... me.myTextBox.DataBindings.Add(“text”,myBizObject,“MyBizObjectProperty”),然后插入/ updatinng只是自动发生。祝你好运。 Seth – 2009-08-06 03:45:11

1

在该片段中,DataSet来自会话。它是什么时候设置的?

你当然可以在一个WinForms应用程序中使用的数据集。它是数据绑定,您有麻烦?

+0

我不理解变化如何进入数据集之间的设置和它的保存。那是绑定的一部分吗?在我的winform应用程序中,我该如何去做? – 2009-08-05 20:26:44

1

你的问题很可能是在这里:

if (confirmChanges == DialogResult.Yes) 
{ 
     _personInfo.AcceptChanges(); 
     ConnectBLL.BLL.Person.Update(_personInfo); 
} 

的AcceptChanges设置的RowState为Unchanged对准备要更新所有行。坦率地说,这很可能是更好的使用whatChanged作为将从不必重新检查更改的行保持你的适配器。

if (confirmChanges == DialogResult.Yes) 
{ 
     ConnectBLL.BLL.Person.Update(whatChanged); 
     _personInfo.AcceptChanges(); 
}