294 lines
7.2 KiB
C#

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using ProjectTracker.Library;
public partial class ProjectEdit : System.Web.UI.Page
{
private enum Views
{
MainView = 0,
AssignView = 1
}
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
ApplyAuthorizationRules();
}
else
this.ErrorLabel.Text = string.Empty;
}
private void ApplyAuthorizationRules()
{
Project obj = GetProject();
// project display
if (Project.CanEditObject())
{
if (obj.IsNew)
this.DetailsView1.DefaultMode = DetailsViewMode.Insert;
else
this.DetailsView1.DefaultMode = DetailsViewMode.Edit;
this.AddResourceButton.Visible = !obj.IsNew;
}
else
{
this.DetailsView1.DefaultMode = DetailsViewMode.ReadOnly;
this.AddResourceButton.Visible = false;
}
this.DetailsView1.Rows[
this.DetailsView1.Rows.Count - 1].Visible =
Project.CanEditObject();
// resource display
this.GridView1.Columns[
this.GridView1.Columns.Count - 1].Visible =
Project.CanEditObject();
}
#region Project DetailsView
protected void DetailsView1_ItemCreated(object sender, EventArgs e)
{
if (DetailsView1.DefaultMode == DetailsViewMode.Insert)
{
Project obj = GetProject();
((TextBox)DetailsView1.Rows[1].Cells[1].Controls[0]).Text = obj.Name;
((TextBox)DetailsView1.Rows[2].Cells[1].Controls[0]).Text = obj.Started;
((TextBox)DetailsView1.Rows[3].Cells[1].Controls[0]).Text = obj.Ended;
((TextBox)DetailsView1.FindControl("TextBox1")).Text = obj.Description;
}
}
protected void DetailsView1_ItemInserted(
object sender, DetailsViewInsertedEventArgs e)
{
Project project = GetProject();
if (!project.IsNew)
Response.Redirect("ProjectEdit.aspx?id=" + project.Id.ToString());
}
protected void DetailsView1_ItemUpdated(
object sender, DetailsViewUpdatedEventArgs e)
{
ApplyAuthorizationRules();
}
protected void DetailsView1_ItemDeleted(
object sender, DetailsViewDeletedEventArgs e)
{
Response.Redirect("ProjectList.aspx");
}
#endregion
#region Resource Grid
protected void AddResourceButton_Click(
object sender, EventArgs e)
{
this.MultiView1.ActiveViewIndex =
(int)Views.AssignView;
}
protected void GridView2_SelectedIndexChanged(
object sender, EventArgs e)
{
Project obj = GetProject();
try
{
obj.Resources.Assign(int.Parse(
this.GridView2.SelectedDataKey.Value.ToString()));
if (SaveProject(obj) > 0)
{
this.GridView1.DataBind();
this.MultiView1.ActiveViewIndex = (int)Views.MainView;
}
}
catch (InvalidOperationException ex)
{
ErrorLabel.Text = ex.Message;
}
}
protected void CancelAssignButton_Click(
object sender, EventArgs e)
{
this.MultiView1.ActiveViewIndex =
(int)Views.MainView;
}
#endregion
#region ProjectDataSource
protected void ProjectDataSource_DeleteObject(
object sender, Csla.Web.DeleteObjectArgs e)
{
try
{
Project.DeleteProject(new Guid(e.Keys["Id"].ToString()));
Session["currentObject"] = null;
e.RowsAffected = 1;
}
catch (Csla.DataPortalException ex)
{
this.ErrorLabel.Text = ex.BusinessException.Message;
e.RowsAffected = 0;
}
catch (Exception ex)
{
this.ErrorLabel.Text = ex.Message;
e.RowsAffected = 0;
}
}
protected void ProjectDataSource_InsertObject(
object sender, Csla.Web.InsertObjectArgs e)
{
Project obj = GetProject();
Csla.Data.DataMapper.Map(e.Values, obj, "Id");
e.RowsAffected = SaveProject(obj);
}
protected void ProjectDataSource_SelectObject(
object sender, Csla.Web.SelectObjectArgs e)
{
e.BusinessObject = GetProject();
}
protected void ProjectDataSource_UpdateObject(object sender, Csla.Web.UpdateObjectArgs e)
{
Project obj = GetProject();
Csla.Data.DataMapper.Map(e.Values, obj);
e.RowsAffected = SaveProject(obj);
}
#endregion
#region ResourcesDataSource
protected void ResourcesDataSource_DeleteObject(
object sender, Csla.Web.DeleteObjectArgs e)
{
Project obj = GetProject();
int rid = int.Parse(e.Keys["ResourceId"].ToString());
obj.Resources.Remove(rid);
e.RowsAffected = SaveProject(obj);
}
protected void ResourcesDataSource_SelectObject(
object sender, Csla.Web.SelectObjectArgs e)
{
Project obj = GetProject();
e.BusinessObject = obj.Resources;
}
protected void ResourcesDataSource_UpdateObject(
object sender, Csla.Web.UpdateObjectArgs e)
{
Project obj = GetProject();
int rid = int.Parse(e.Keys["ResourceId"].ToString());
ProjectResource res =
obj.Resources.GetItem(rid);
Csla.Data.DataMapper.Map(e.Values, res);
e.RowsAffected = SaveProject(obj);
}
#endregion
#region ResourceListDataSource
protected void ResourceListDataSource_SelectObject(
object sender, Csla.Web.SelectObjectArgs e)
{
e.BusinessObject =
ProjectTracker.Library.ResourceList.GetResourceList();
}
#endregion
#region RoleListDataSource
protected void RoleListDataSource_SelectObject(
object sender, Csla.Web.SelectObjectArgs e)
{
e.BusinessObject = RoleList.GetList();
}
#endregion
private Project GetProject()
{
object businessObject = Session["currentObject"];
if (businessObject == null ||
!(businessObject is Project))
{
try
{
string idString = Request.QueryString["id"];
if (!string.IsNullOrEmpty(idString))
{
Guid id = new Guid(idString);
businessObject = Project.GetProject(id);
}
else
businessObject = Project.NewProject();
Session["currentObject"] = businessObject;
}
catch (System.Security.SecurityException)
{
Response.Redirect("ProjectList.aspx");
}
}
return (Project)businessObject;
}
private int SaveProject(Project project)
{
int rowsAffected;
try
{
Session["currentObject"] = project.Save();
rowsAffected = 1;
}
catch (Csla.Validation.ValidationException ex)
{
System.Text.StringBuilder message = new System.Text.StringBuilder();
message.AppendFormat("{0}<br/>", ex.Message);
if (project.BrokenRulesCollection.Count == 1)
message.AppendFormat("* {0}: {1}",
project.BrokenRulesCollection[0].Property,
project.BrokenRulesCollection[0].Description);
else
foreach (Csla.Validation.BrokenRule rule in project.BrokenRulesCollection)
message.AppendFormat("* {0}: {1}<br/>", rule.Property, rule.Description);
this.ErrorLabel.Text = message.ToString();
rowsAffected = 0;
}
catch (Csla.DataPortalException ex)
{
this.ErrorLabel.Text = ex.BusinessException.Message;
rowsAffected = 0;
}
catch (Exception ex)
{
this.ErrorLabel.Text = ex.Message;
rowsAffected = 0;
}
return rowsAffected;
}
}