Windows窗体应用程序如何将返回值从一个窗体形式转换为其他窗体

时间:2016-01-01 23:12:13

标签: c# windows forms inheritance

我正在编写一个应用程序,它将存储我观看过的电影,我将来会在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中的按钮有没有办法做到这一点?

2 个答案:

答案 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 但可能是矫枉过正。