欢迎讨论,大家在作OO设计时,如何表示对象集合的?

river723 2004-12-17 11:17:18
不考虑实体层用继承dataset的作法,我认为这种作法不是纯粹的OO,在设计时要考虑数据库的一些因素,有点不伦不类.
我目前的作法是用ArrayList来作为对象集合,但在使用上不太方便,比如在与datagrid绑定后,无法象dataset与datagrid绑定那样可以随意编辑后,最后一次存入数据库.
请问大家都是如何解决这个问题的.
...全文
218 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
lgg06 2004-12-25
  • 打赏
  • 举报
回复
up
liuchengit 2004-12-25
  • 打赏
  • 举报
回复
cppTrier(cnblogs.com/hush) 这位仁兄有见地,说得不错,,
linfengcyl 2004-12-25
  • 打赏
  • 举报
回复
//对不起,上面Intersect不小心写错了一点,改为:
//可能还有别的问题.没测试过:)

public void Intersect(ICollection collection)
{
foreach(object item in collection)
{
if(!this.Contains(item))
{
this.Remove(item);
}
}
}
linfengcyl 2004-12-25
  • 打赏
  • 举报
回复
//最近忙着搬家,不好意思.献丑了:)
//本示例主要是增加了其对"要求唯一性","限定类型","合集","并集","交集"支持.
//你可以看看相关的MSDN.
using System;
using System.Collections;

namespace Com.LinFeng.Common
{
public class ExtendedCollection :CollectionBase,IExtendedCollection
{
protected Type _type;
protected bool _unique;

public ExtendedCollection(Type type,bool unique)
{
this._type=type;
this._unique=unique;
}
public ExtendedCollection(Type type):this(type,false){}
public ExtendedCollection(bool unique):this(null,unique){}
public ExtendedCollection():this(null,false){}

public virtual int Add(object value)
{
if(this._type!=null && (!this._type.IsInstanceOfType(value)))
{
throw new ArgumentException("类型不正确.","value");
}
if(this._unique ==true && this.Contains(value))
{
throw new ArgumentException("禁止插入重复元素.","value");
}
else
{
return List.Add(value);
}
}
public virtual bool Insert(int index,object value)
{
if(!(this._type==null || this._type.IsInstanceOfType(value)))
{
throw new ArgumentException("类型不正确.","value");
}
if(this._unique ==true && this.Contains(value))
{
throw new ArgumentException("禁止插入重复元素.","value");
}
else
{
List.Insert(index,value);
return true;
}
}
public virtual void Remove(object value)
{
List.Remove(value);
}
public virtual bool Contains(object value)
{
return List.Contains(value);
}
public virtual int IndexOf(object value)
{
return List.IndexOf(value);
}
public virtual object this[int index]
{
get
{
return (object)List[index];
}
set
{
if(!(this._type==null || this._type.IsInstanceOfType(value)))
{
throw new ArgumentException("类型不正确.","this["+index+"]");
}
if(this._unique ==true && this.Contains(value))
{
throw new ArgumentException("禁止插入重复元素.","this["+index+"]");
}
else
{
List[index]=value;
}
}
}
#region IExtendedCollection 成员

public void Merge(ICollection collection)
{
foreach(object item in collection)
{
if(!this.Contains(item))
{
this.Add(item);
}
}
}

public void Subtract(ICollection collection)
{
foreach(object item in collection)
{
if(this.Contains(item))
{
this.Remove(item);
}
}
}

public void Intersect(ICollection collection)
{
foreach(object item in this)
{
if(!this.Contains(item))
{
this.Remove(item);
}
}
}

#endregion
}
}
river723 2004-12-20
  • 打赏
  • 举报
回复
没人再给点意见了吗。
river723 2004-12-19
  • 打赏
  • 举报
回复
原来csdn上就有介绍的文档,居然一直没看到.
http://dev.csdn.net/develop/article/28/28719.shtm
river723 2004-12-18
  • 打赏
  • 举报
回复
首先谢谢思归老大和各们弟兄的关注.
我现在就是用的就是ArrayList,我主要是用winform,主要是觉的用ArrayList与DataGrid绑定使用不如Dataset绑定方便,比如,ArrayList与DataGrid绑定后,无法在datagrid中直接新增一行,必须用新增按钮来更新数据库后,再重新绑定Datagrid,感觉不太爽,另外在datagrid中修改数据后(可能进行了增加,删除,修改)的确被绑定的ArrayList也被修改了,但无法象dataset那样可直接update数据到数据库,也就是说ArrayList无法直接与数据库建立联系(也可能是我不会).
我主要想看看大家都是如何处理的.
另外,我感觉 LinFengCyl(林风)所说 继承CollectionBase可能是个好办法,但以前没用过,正在研究中,有结果后我会在这里公布,不过这一两天没时间,再加上本人天生鲁钝,可能要过几天.
gbbword 2004-12-18
  • 打赏
  • 举报
回复
恐怕楼主是想用自义的集合类来实现楼上思归大侠的方法吧?看MSDN,这个东西很不错,如果不是真的特别需要的话,ArrayList也不错啊。
GmLibra 2004-12-18
  • 打赏
  • 举报
回复
用ArrayList来作为对象集合,在与datagrid绑定后,随意编辑后.也可以跟据编辑情况情况构建SQL语句,最后一次存入数据库.
lih163 2004-12-18
  • 打赏
  • 举报
回复
运用对象要适用,否则还不如其他方法简便呢
saucer 2004-12-18
  • 打赏
  • 举报
回复
一些赝码

public class YourObject
{
public string Prop1 {...}
public string Prop2 {...}
}

ArrayList al = new ArrayList();
YourObject yo = new YourObject();
yo.Prop1 = "...";
yo.Prop2 = "...";
al.Add(yo);
Session["Data"] = al;

或在Data Access层

ArrayList al = new ArrayList();
SqlDataReader dr = ...;
while (dr.Read())
{
YourObject yo = new YourObject();
yo.Prop1 = dr["ColumnName"].ToString();
...
al.Add(yo);
}
dr.Close();
return al;


YourDataGrid.DataSource = al;
YourDataGrid.DataBind();

<EditItemTemplate>
<asp:TextBox id="Textbox1" runat="server" Text='<%#DataBinder.Eval(Container.DataItem,"Prop1")%>' />
</EditItemTemplate>

when updating, in UpdateCommand you could do

ArrayList al = (ArrayList)Session["Data"];
YourObject o = (YourObject)al[YourDataGrid.EditItemIndex];
TextBox tb = (TextBox)e.Item.FindControl("Textbox1");
o.Prop1 = tb.Text;
....
saucer 2004-12-18
  • 打赏
  • 举报
回复
建议使用类似NHibernate或其他类似的O/R Mapper或框架
http://www.theserverside.net/news/thread.tss?thread_id=29914

否则的话,你只能自己写
1。给你的对象添加properties
2。从SQL获取数据,产生你的对象或对象集合
3。用通常的方式绑定你的对象集合到DataGrid上,然后,你也许需要把你的对象集合存在Session变量里,或其他的persistent方式
4。修改后更新相应对象
5。从你的对象或对象集合生成相应的更新SQL语句(也可以用stored procedure),如果有多个对象需要更新的话,把语句连接起来,一次执行

在ASP.NET 2.0里,将会有更好的Object Data Binding支持

comefeel 2004-12-18
  • 打赏
  • 举报
回复
进来顶...
kqh0319 2004-12-18
  • 打赏
  • 举报
回复
UP
jonescheng 2004-12-18
  • 打赏
  • 举报
回复
楼上说的一些就可以阿。如果你想参考的放,请参考NHB等一些开源ORM的代码
happyjun2000 2004-12-18
  • 打赏
  • 举报
回复
gz..
river723 2004-12-18
  • 打赏
  • 举报
回复
to LinFengCyl(林风):
真的是惭愧了,这在概就是我要找的东西,能发一小段代码让我参考一下吗。
river723 2004-12-18
  • 打赏
  • 举报
回复
to GmLibra(平常心)
如何做呢,能否具体点。
linfengcyl 2004-12-18
  • 打赏
  • 举报
回复
继承System.Collections.CollectionBase即可,非常方便.
cppTrier 2004-12-17
  • 打赏
  • 举报
回复
其实我觉得,OO只是一种完成工作的手段,没有必要拘泥于100%的OO,只要能够很好地完成任务,无论使用何种方法都不是问题。没有必要仅仅为了OO的传粹性,而牺牲DataSet的易用性。当然在不适合使用DataSet的场合(考虑到传输和缓存的开销),可以考虑自己实现一个对象集合。
加载更多回复(1)

110,534

社区成员

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

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

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