我正在编写一个应用程序,它将存储我观看过的电影,我将来会在XML文件中看到(仅用于培训的简单应用程序)
我用来在我的应用程序中存储数据的主要对象如下:
public class FilmDto : IFilmDto
{
public int FilmId { get; set; }
public string Name { get; set; }
public DateTime? WatchedDate { get; set; }
public int ParentId { get; set; }
public string ParentName { get; set; }
public FilmStatus FilmStatus { get; set; }
public string Category { get; set; }
public string SubCategory { get; set; }
}
所有操作都在Service类中执行。有电影列表作为主要数据文件。 服务类看起来像这样:
public class FilmService
{
private List<FilmDto> _films = new List<FilmDto>();
private FilmDao _filmDao = new FilmDao();
private FilmService()
{
_films = _filmDao.Load();
}
public static FilmService Inicialize()
{
return new FilmService();
}
public void Save()
{
_filmDao.Save(_films);
}
public List<FilmDto> GetFilmsByCriteria(FilmCriteriaDto criteria, bool withStatus)
{
if (withStatus)
{
return _films.Where(x => x.Category.Contains(criteria.Category)
&& x.SubCategory.Contains(criteria.SubCategory)
&& x.ParentName.Contains(criteria.ParentName)
&& x.Name.Contains(criteria.Name)
&& x.FilmStatus.Equals(criteria.FilmStatus)).ToList();
}
else
{
return _films.Where(x => x.Category.Contains(criteria.Category)
&& x.SubCategory.Contains(criteria.SubCategory)
&& x.ParentName.Contains(criteria.ParentName)
&& x.Name.Contains(criteria.Name)).ToList();
}
}
public StatisticDto GetFilmStatistic()
{
return new StatisticDto
{
TotalCount = _films.Count,
TotalToWatch = _films.Where(x => x.FilmStatus == FilmStatus.DoObejzenia).Count(),
TotalWatched = _films.Where(x => x.FilmStatus == FilmStatus.Obejzany).Count()
};
}
public List<string> GetAllParentName()
{
return _films.Select(x => x.ParentName).ToList();
}
public void Add(FilmDto film)
{
_films.add(film);
}
// Private Methods
private int GetNexID()
{
return _films.OrderByDescending(x => x.FilmId).FirstOrDefault().FilmId + 1;
}
}
现在是时候形成我用来重新发布数据了。表单使用服务实例和调用方法表单服务来获取那些数据(表单只有显示数据,没有任何逻辑来转换它)
public partial class Form1 : Form
{
private FilmService _filmService
public Form1()
{
_filmService = FilmService.Inicialize();
InitializeComponent();
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
FillTable(new FilmCriteriaDto(), false);
}
private void FillTable(FilmCriteriaDto criteria,bool witchStatus)
{
List<FilmDto> films = _filmService.GetFilmsByCriteria(criteria,witchStatus);
foreach (FilmDto film in films)
{
dataGridView1.Rows.Add(film.Name,film.WatchedDate,film.ParentName,film.Category,film.SubCategory,film.FilmStatus);
}
}
private void statisticToolStripMenuItem_Click(object sender, EventArgs e)
{
StatisticDto stats = _filmService.GetFilmStatistic();
MessageBox.Show(string.Format("Total :{0}\nWatched {1}\nTo watch {2}"
, stats.TotalCount, stats.TotalWatched, stats.TotalToWatch), "Stats INFO",MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void addToolStripMenuItem_Click(object sender, EventArgs e)
{
...Call new form to add new film
}
}
到目前为止,一切都很好。但现在我需要创建一个新的表单(Form2),它将使TexBox将新的电影数据插入到我的服务列表中。不,我不知道这样做。
首先我认为我将private FilmService _filmService
更改为public FilmService FilmService {get;set;}
在form2中创建构造函数,我在其中给出Form1对象,如public Form2(Form1 form)
,并将其调用为Form1,如:Form2 form = new Form2(this)
。在这种情况下,我可以访问该服务方法,但它看起来像form.FilmService.Add
,这是不好的。换句话说,我可以将FilmService对象作为参数传递,但是这样Form1将不知道Form2制作的更改。我想在Form2中创建方法,将FilmDto
对象返回到Form1
,例如我点击Form2
中的按钮有没有办法做到这一点?
答案 0 :(得分:1)
您可以使用不同的方法来执行此操作。
最简单的方法是使用Dialogs。您可以通过调用ShowDialog打开Form2
作为fialog,然后只有在结果正常时才能阅读该属性。这是在WinForms中实现行为的一般方法。
private void addToolStripMenuItem_Click(object sender, EventArgs e)
{
// Show testDialog as a modal dialog and determine if DialogResult = OK.
if (form2.ShowDialog(this) == DialogResult.OK)
{
// Read the contents of testDialog's TextBox.
this.txtResult.Text = form2.TextBox1.Text;
}
}
请注意,如果用户点击按钮并以其他方式DialogResult
,则必须将Form2
中的DialogResult.OK
属性设置为DialogResult.Cancel
。当用户决定不添加新电影时,它可以帮助您处理场景。
另一种方法是使用events。在Form2
中声明新事件并为此事件订阅Form1
。在按钮单击时提升新事件并将您的数据作为事件的参数传递。
答案 1 :(得分:0)
首先,你可以使FilmService
静态或单身。
此外,您可以在此处找到适合您特定任务的示例x - Communicate between two windows forms in C#
在我的观点中,你应该使用MVP模式 - https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93presenter 但可能是矫枉过正。