我正在编写一个小应用程序,仅在几个方面管理Trello板,例如列表中的卡片排序、基于到期日和/或标签移动/复制卡片、定期归档列表以及基于标签生成报告等。因此,我在Manatee.Trello库周围组装了一个外观,以简化服务的接口。
我在图书馆过得很舒服,而且一切都比较顺利。但是,我在Card类上编写了一个扩展方法,用于在列表中或列表之间移动卡片,以及重复调用此扩展方法以将所有卡从一个列表移动到另一个列表的方法。
我的问题是,当在一张7张卡的虚拟列表上运行代码时,它没有错误地完成,但至少有一张卡实际上没有被移动(尽管有多达3张卡没有移动)。我不知道这是因为我移动得太快了,还是我需要调整TrelloConfiguration.ChangeSubmissionTime,或者什么的。我试过拖延时间,但没什么用。
这是我的呼叫代码:
public void MoveCardsBetweenLists(
string originListName,
string destinationListName,
string originBoardName,
string destinationBoardName = null)
{
var fromBoard = GetBoard(originBoardName); // returns a Manatee.Trello.Board
var toBoard = destinationBoardName == null
|| destinationBoardName.Equals(originBoardName, StringComparison.OrdinalIgnoreCase)
? fromBoard
: GetBoard(destinationBoardName);
var fromList = GetListFromBoard(originListName, fromBoard); // returns a Manatee.Trello.List from the specified Board
var toList = GetListFromBoard(destinationListName, toBoard);
for (int i = 0; i < fromList.Cards.Count(); i++)
{
fromList.Cards[i].Move(1, toList);
}
}下面是我在Manatee.Trello.Card上的扩展方法:
public static void Move(this Card card, int position, List list = null)
{
if (list != null && list != card.List)
{
card.List = list;
}
card.Position = position;
}发布于 2016-10-08 21:52:15
我已经创建了一个测试来复制您想要的功能。基本上,我在我的板上创建了7张卡片,将它们移到另一个列表中,然后删除它们(只是为了保持初始状态)。
private static void Run(System.Action action)
{
var serializer = new ManateeSerializer();
TrelloConfiguration.Serializer = serializer;
TrelloConfiguration.Deserializer = serializer;
TrelloConfiguration.JsonFactory = new ManateeFactory();
TrelloConfiguration.RestClientProvider = new WebApiClientProvider();
TrelloAuthorization.Default.AppKey = TrelloIds.AppKey;
TrelloAuthorization.Default.UserToken = TrelloIds.UserToken;
action();
TrelloProcessor.Flush();
}
#region http://stackoverflow.com/q/39926431/878701
private static void Move(Card card, int position, List list = null)
{
if (list != null && list != card.List)
{
card.List = list;
}
card.Position = position;
}
[TestMethod]
public void MovingCards()
{
Run(() =>
{
var list = new List(TrelloIds.ListId);
var cards = new List<Card>();
for (int i = 0; i < 10; i++)
{
cards.Add(list.Cards.Add("test card " + i));
}
var otherList = list.Board.Lists.Last();
for(var i = 0; i < cards.Count; i++)
{
Move(card, i, otherList);
}
foreach (var card in cards)
{
card.Delete();
}
});
}
#endregion快速问题:在执行结束之前,您是否打电话给TrelloProcessor.Flush()?如果没有,那么在应用程序结束时,请求处理器队列中可能会保留一些更改,因此它们将永远不会被发送。有关更多信息,请参见我的关于处理请求的wiki页面。
另外,我注意到您正在使用1作为每个移动的位置。通过这样做,你最终会得到一个不可靠的订单。Trello使用的位置数据是浮点数。要将一张牌放在另外两张牌之间,只需取其他牌的平均数。在您的示例中,(如果目标列表为空),我建议为排序发送indexer变量。如果目标列表不是空的,则需要根据列表中的其他卡片(通过Trello使用的平均值方法)计算一个新的位置。
最后,我喜欢你的扩展代码。如果您认为添加到库中是有用的想法,请随时分叉GitHub回购并创建一个拉请求。
https://stackoverflow.com/questions/39926431
复制相似问题