我很难找到适合这种情况的解决方案:
我有两个数据网格(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
- 是右侧网格。
我在这段代码中所做的是:
currentTemplateList
是否包含所选值。DataSource
设置为currentTemplateList.Items
将其添加到右侧网格。问题出现在这里:
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}}部分。
有没有一些干净的方法来解决这个问题?因为使用此代码,新项目不会添加到右侧网格,每次都会清除它们,而在右侧我只有最后一次移动的项目。当网格不为空时,我需要找到一种方法来在集合中保留已选择的项目。
答案 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
来电。