我是CSLA的新手,所以这是我的问题。 我有简单的Windows窗体应用程序,带有datagridview和2个按钮,保存和删除。我需要一个解决方案来实现Save按钮的Save()方法,以及删除按钮的Delete()方法。我相信这很简单,但我可以' t弄清楚如何调用这两个方法.Datagridview控件是可编辑的,所以我的想法是当用户添加新行或编辑一些现有单元格并单击按钮保存时,这些数据将记录在我的数据库中。 提前谢谢!
我正在使用根可编辑集合和子可编辑构造型。 这是root的代码:
[Serializable]
public class PDVCollection : BusinessBindingListBase<PDVCollection,PDV>
{
private PDVCollection()
{
AllowNew = true;
}
protected override object AddNewCore()
{
var item = PDV.PDV();
Add(item);
return item;
}
#region Factory Methods
public static PDVCollection GetAll()
{
return DataPortal.Fetch<PDVCollection>();
}
protected override void DataPortal_Update()
{
Child_Update();
}
#endregion
#region Data Access
private void DataPortal_Fetch()
{
RaiseListChangedEvents = false;
MySqlConnection con = new MySqlConnection("server=localhost;user id=root;password=1234;persistsecurityinfo=True;database=dbpos");
MySqlCommand cmd = new MySqlCommand("usp_PDVSelect", con);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
try
{
con.Open();
MySqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
var stopa = PDV.GetPDV(dr);
Add(stopa);
}
con.Close();
}
catch (Exception xcp)
{
throw xcp;
}
RaiseListChangedEvents = true;
}
}
#endregion
这是一个可编辑子代码
[Serializable]
public class PDV : BusinessBase<PDV>
{
public static readonly PropertyInfo<int> IdProperty = RegisterProperty<int>(c => c.Id);
public int Id
{
get { return GetProperty(IdProperty); }
private set { LoadProperty(IdProperty, value); }
}
public static readonly PropertyInfo<Guid> UidProperty = RegisterProperty<Guid>(c => c.Uid);
public Guid Uid
{
get { return GetProperty(UidProperty); }
private set { LoadProperty(UidProperty, value); }
}
public static readonly PropertyInfo<decimal> StopaProperty = RegisterProperty<decimal>(c => c.Stopa);
public decimal Stopa
{
get { return GetProperty(StopaProperty); }
set { SetProperty(StopaProperty, value); }
}
#region Factory Methods
internal static PDV NewPDV()
{
return DataPortal.CreateChild<PDV>();
}
internal static PDV GetPDV(MySqlDataReader dr)
{
return DataPortal.FetchChild<StopaPDV>(dr);
}
private StopaPDV()
{
}
#endregion
#region DataAccess
protected override void Child_Create()
{
LoadProperty(UidProperty, Guid.NewGuid());
base.Child_Create();
}
private void Child_Fetch(MySqlDataReader dr)
{
LoadProperty(IdProperty,Int32.Parse(dr[0].ToString()));
LoadProperty(UidProperty, Guid.Parse(dr[1].ToString()));
LoadProperty(StopaProperty, Decimal.Parse(dr[2].ToString()));
}
private void Child_Insert()
{
MySqlConnection con = new MySqlConnection("server=localhost;user id=root;password=1234;persistsecurityinfo=True;database=dbpos");
MySqlCommand cmd = new MySqlCommand("usp_PDVInsert", con);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.Add("_uid", MySqlDbType.VarChar, 36).Value = Uid;
cmd.Parameters.Add("_stopa", MySqlDbType.Decimal).Value = Stopa;
cmd.Parameters.Add("_id", MySqlDbType.Int32).Direction = System.Data.ParameterDirection.Output;
int ID = 0;
try
{
con.Open();
cmd.ExecuteNonQuery();
ID = Convert.ToInt32(cmd.Parameters["_id"].Value);
con.Close();
}
catch (Exception xcp)
{
throw xcp;
}
}
private void Child_Update()
{
MySqlConnection con = new MySqlConnection("server=localhost;user id=root;password=1234;persistsecurityinfo=True;database=dbpos");
MySqlCommand cmd = new MySqlCommand("usp_PDVUpdate", con);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.Add("_stopa",MySqlDbType.Decimal).Value = Stopa;
try
{
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
catch (Exception xcp)
{
throw xcp;
}
}
private void Child_DeleteSelf()
{
MySqlConnection con = new MySqlConnection("server=localhost;user id=root;password=1234;persistsecurityinfo=True;database=dbpos");
MySqlCommand cmd = new MySqlCommand("usp_PDVDeleteById", con);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.Add("_id", MySqlDbType.Int32).Value = Id;
try
{
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
catch (Exception xcp)
{
throw xcp;
}
}
#endregion
}
答案 0 :(得分:2)
如果我理解正确,您正在寻找有关如何实施保存和删除按钮事件处理程序的帮助,这些事件处理程序将对您的CSLA可编辑根列表/集合起作用,以实现对业务对象中数据的保存或删除。
假设这确实是你所追求的,那么以下内容应该有所帮助。
在“保存”按钮事件处理程序中,您只需在Save()
实例上调用PDVCollection
实例方法。
对于Delete按钮事件处理程序,您需要知道要删除的集合中的哪个项目,然后从父/根集合中删除它。
下面是Form的代码的快速示例(带有2个按钮,一个DataGridView和一个BindingSource控件):
public partial class MainForm : Form
{
private BusinessLogic.PDVCollection _pdvColllection;
private BusinessLogic.PDV _pdvCurrentlySelected;
public MainForm()
{
InitializeComponent();
// Keep a reference to the editable root collection
_pdvColllection = BusinessLogic.PDVCollection.GetList();
// Initialise the BindingSource with data. The DataGridView is connected to the BindingSource
pdvCollectionBindingSource.DataSource = _pdvColllection;
}
private void pdvCollectionBindingSource_CurrentChanged( object sender, EventArgs e )
{
// Update a local reference with the currently selected item in the binding source (set by the DataGridView)
_pdvCurrentlySelected = pdvCollectionBindingSource.Current as BusinessLogic.PDV;
}
private void saveButton_Click( object sender, EventArgs e )
{
// Save the root collection - this will update all of the items in the collection.
// - Note a new root collection is returned.
if ( !_pdvColllection.IsValid )
{
MessageBox.Show( "Cannot save list because some items are invalid", "Save", MessageBoxButtons.OK, MessageBoxIcon.Information );
return;
}
_pdvColllection = _pdvColllection.Save();
// Update the binding source with the new instance;
pdvCollectionBindingSource.DataSource = null;
pdvCollectionBindingSource.DataSource = _pdvColllection;
}
private void deleteButton_Click( object sender, EventArgs e )
{
// Delete requires a PDV instance to be selected in the DataGridView
if ( _pdvCurrentlySelected == null )
{
MessageBox.Show( "Item to delete not selected", "Delete", MessageBoxButtons.OK, MessageBoxIcon.Information );
return;
}
_pdvColllection.Remove( _pdvCurrentlySelected );
// Depending on whether you want to save this delete to the background immediately, or leave it up to the user you may want to
// Save the root collection next:
saveButton.PerformClick();
}
}
希望有所帮助。