在C#中保留列表中的项目

时间:2017-09-28 09:17:52

标签: c# winforms design-patterns grid

我很难找到适合这种情况的解决方案:

我有两个数据网格(DevExpress)。在左侧网格上,我有一些模板值(行)。我在两个网格之间有一个移动按钮,在点击事件中应该执行从左网格到右网格移动所选项目。在复制该值之前,应检查该值是否已存在于右网格中。如果是:显示已存在的消息,如果不存在,则将所选值添加到右网格。

在代码中,我有一些包含这些值的集合:

private void btnMove_Click(object sender, EventArgs e)
{
    ClosingStockTemplateModel _mClosingStockTemplateModel = (ClosingStockTemplateModel)gridViewAvailableTemplates.GetRow(gridViewAvailableTemplates.FocusedRowHandle);
    ClosingStockTemplateModel currentTemplateRow = new ClosingStockTemplateModel();
    ModelCollection<ClosingStockTemplateModel> currentTemplateList = new ModelCollection<ClosingStockTemplateModel>();

    for (var i = 0; i < currentTemplateList.Items.Count; i++)
    {
        currentTemplateRow = (ClosingStockTemplateModel)gridViewTemplatesToPrint.GetRow(i);
        currentTemplateList.Items.Add(currentTemplateRow);
    }

    if (currentTemplateList.Items.Contains(_mClosingStockTemplateModel))
    {
        MessageBox.Show("Item has already been selected.");
        return;
    }
    else
    {
        currentTemplateList.Items.Add(_mClosingStockTemplateModel);
        grdTemplatesToPrint.DataSource = null;
        grdTemplatesToPrint.DataSource = currentTemplateList.Items.OrderBy(i => i.TEMPLATE);
    }
}

gridViewAvailableTemplates - 是左侧网格。 gridViewTemplatesToPrint - 是右侧网格。

我在这段代码中所做的是:

  1. 获取左侧网格中当前选定的行:
  2. 创建新的集合,我将从右侧网格中添加所有项目(稍后我将使用它来比较和检查我已选择的内容)。
  3. 通过右网格行循环将项目添加到临时集合中。
  4. 检查currentTemplateList是否包含所选值。
  5. 如果是,请显示消息,如果未通过将DataSource设置为currentTemplateList.Items将其添加到右侧网格。
  6. 问题出现在这里:

    ModelCollection<ClosingStockTemplateModel> currentTemplateList = new ModelCollection<ClosingStockTemplateModel>();
    

    我需要创建ModelCollection的实例,但每次单击按钮时,移动列表都会被实例化并被清除。所以我尝试过这样的事情:

    ModelCollection<ClosingStockTemplateModel> currentTemplateList;
    if(gridViewTemplatesToPrint.RowCount == 0)
    {
        currentTemplateList = new ModelCollection<ClosingStockTemplateModel>();
    }
    else
    {
        for (var i = 0; i < currentTemplateList.Items.Count; i++)
        {
            currentTemplateRow = (ClosingStockTemplateModel)gridViewTemplatesToPrint.GetRow(i);
            currentTemplateList.Items.Add(currentTemplateRow);
        }
    }
    

    仅在第一次单击移动按钮且右侧网格仍为空时创建currentTemplateList的干净实例,但是currentTemplateList在{else中是未知的局部变量时出现问题1}}部分。 有没有一些干净的方法来解决这个问题?因为使用此代码,新项目不会添加到右侧网格,每次都会清除它们,而在右侧我只有最后一次移动的项目。当网格不为空时,我需要找到一种方法来在集合中保留已选择的项目。

2 个答案:

答案 0 :(得分:0)

  

在类级声明跟随字段并使其成为静态....和   在需要的地方初始化它......

> ModelCollection<ClosingStockTemplateModel> currentTemplateList = new
> ModelCollection<ClosingStockTemplateModel>();

答案 1 :(得分:0)

您不必每次都设置DataSource。将DataSource设置为您的集合一次,然后仅使用列表或集合添加或删除项目。 这是一个简单的例子(2个网格和2个按钮)

private List<ClosingStockTemplateModel> moTemplatesToPrintList;
private List<ClosingStockTemplateModel> moAvailableTemplates;

public Form4()
{
    InitializeComponent();

    this.moAvailableTemplates= new List<ClosingStockTemplateModel>()
    {
        new ClosingStockTemplateModel() {ID = 1, TEMPLATE ="Template 1" },
        new ClosingStockTemplateModel() {ID = 2, TEMPLATE ="Template 2" },
        new ClosingStockTemplateModel() {ID = 3, TEMPLATE ="Template 3" },
        new ClosingStockTemplateModel() {ID = 4, TEMPLATE ="Template 4" },
    };

    this.moTemplatesToPrintList = new List<ClosingStockTemplateModel>();

    this.grdAvailableTemplates.DataSource = this.moAvailableTemplates;
    this.grdTemplatesToPrint.DataSource = this.moTemplatesToPrintList;
}

private void cmdAdd_Click(object sender, EventArgs e)
{
    var loGridViewAvailableTemplates = (this.grdAvailableTemplates.MainView as GridView);
    ClosingStockTemplateModel loClosingStockTemplateModel = loGridViewAvailableTemplates.GetRow(loGridViewAvailableTemplates.FocusedRowHandle) as ClosingStockTemplateModel;

    if (loClosingStockTemplateModel != null && 
        !this.moTemplatesToPrintList.Any(item => item.ID == loClosingStockTemplateModel.ID))
    {
        this.moTemplatesToPrintList.Add(loClosingStockTemplateModel);
        this.moAvailableTemplates.Remove(loClosingStockTemplateModel);
    }
    this.grdAvailableTemplates.RefreshDataSource();
    this.grdTemplatesToPrint.RefreshDataSource();
}

private void cmdRemove_Click(object sender, EventArgs e)
{
    var loGridViewTemplatesToPrint = (this.grdTemplatesToPrint.MainView as GridView);
    ClosingStockTemplateModel loClosingStockTemplateModel = loGridViewTemplatesToPrint.GetRow(loGridViewTemplatesToPrint.FocusedRowHandle) as ClosingStockTemplateModel;

    if (loClosingStockTemplateModel != null &&
        !this.moAvailableTemplates.Any(item => item.ID == loClosingStockTemplateModel.ID))
    {
        this.moAvailableTemplates.Add(loClosingStockTemplateModel);
        this.moTemplatesToPrintList.Remove(loClosingStockTemplateModel);
    }
    this.grdAvailableTemplates.RefreshDataSource();
    this.grdTemplatesToPrint.RefreshDataSource();
}

public class ClosingStockTemplateModel
{
    public int ID { get; set; }
    public string TEMPLATE { get; set; }
}

如果您使用通用BindingList代替List,则可以删除RefreshDataSource来电。