C# 如何在C中向TableLayout面板添加撤消和重做按钮

C# 如何在C中向TableLayout面板添加撤消和重做按钮,c#,undo,tablelayoutpanel,redo,C#,Undo,Tablelayoutpanel,Redo,我在做一个游戏,你们把8个皇后放在棋盘上,这样就不会有皇后攻击其他任何一个。这是我的家庭作业。 我使用了TableLayoutPanel 8x8,每个单元格中都有PictureBox。它们会在单击时更改颜色或图片,并向用户显示哪一个单元格可用。 但我想实现撤销,所以用户可以退一步,如果他不喜欢他的皇后的位置。我在谷歌上搜索了很多,但每一个撤销重做解决方案都是关于整数和字符串的,我不知道如何在我的表面板中使用它。 你们知道怎么做吗?在改变颜色之前,我试图制作另一个复制面板并将原始面板复制到其中,

我在做一个游戏,你们把8个皇后放在棋盘上,这样就不会有皇后攻击其他任何一个。这是我的家庭作业。

我使用了TableLayoutPanel 8x8,每个单元格中都有PictureBox。它们会在单击时更改颜色或图片,并向用户显示哪一个单元格可用。 但我想实现撤销,所以用户可以退一步,如果他不喜欢他的皇后的位置。我在谷歌上搜索了很多,但每一个撤销重做解决方案都是关于整数和字符串的,我不知道如何在我的表面板中使用它。 你们知道怎么做吗?在改变颜色之前,我试图制作另一个复制面板并将原始面板复制到其中,如果我想撤消,则实际显示复制面板,但由于某种原因,它无法工作

如果在某个地方已经回答了如何撤销TableLayoutPanel,请您引导我找到该指南好吗

  private void pictureBox1_Click(object sender, EventArgs e)
    {
        PictureBox picture =  (PictureBox)sender;
        //checking if cell is empty 
        if(picture.BackColor==Color.White)
        { 
            picture.Image = Properties.Resources.kraljica;

            int column = tableLayoutPanel1.GetCellPosition(picture).Column;
            int row = tableLayoutPanel1.GetCellPosition(picture).Row;

            int j = column;
            int i = row;
            //changing color of down right diagonal according to current position of queen
            while (i <= 7 && j <= 7)
            {
                tableLayoutPanel1.GetControlFromPosition(j, i).BackColor = Color.DarkRed;
                i++;
                j++;                  
            }

欢迎来到StackOverFlow

通常情况下,我们会要求您提供一些代码来帮助我们解决您的问题,但我会尝试给您一些没有提示的提示

你需要保留过去移动的历史记录,在本例中,这将是一个记录蜂王从哪里开始到哪里结束的牢房位置的历史记录

我怀疑您一定是在使用OnClick事件或类似的事件来确定选择了哪个queen以及它移动到了哪里——如果不是,那么逻辑仍然是一样的

您希望使用TableLayoutPanel控件的GetRow和GetColumn方法,并将结果存储在列表控件中,例如

public class Move
    {
      int startRow;
      int startColumn;
      int endRow;
      int endColumn;
    }
那么在你的代码中有属性

public List<Move> ListOfMoves = new List<Move>();
public SelectedMoveIndex {get;set;}
其中x1、y1、x2、y2的值取自移动开始和移动结束时的GetRow和GetColumn

要撤消移动,请使用存储在SelectedMoveIndex中的移动值并向后播放,例如endRow和endColumn,将其作为开始值,然后减小SelectedMoveIndex的值。重做将使用存储在SelectedMoveIndex中的值,然后递增SelectedMoveIndex


如果您进行了未存储的新移动,则在添加新移动之前,您需要在选择MoveIndex后删除元素。

是否需要对表进行开箱即用的撤消操作?我想在你们的情况下,你们需要使用任务模式来进行撤销,因为你们撤销的不仅仅是ui——它的撤销游戏moveHello,谢谢你们的回复。我编辑并添加了部分代码。我有“onclick”“picturebox”和6个循环,可以改变不可用单元格的颜色。我是否必须添加您在每个循环中解释的移动列表?但是,我想当我按下undo时,它只会撤消一种单元格颜色,而不是整个表的设置。你只想保留一个列表,假设这适用于屏幕上的皇后,否则它将是每个皇后一个列表。所以它不会存储在OnClick事件中,而是存储在我假设的OnClick事件处理程序所属的表单类中。
ListOfMoves.Add(new Move(){startRow = x1, startColumn=y1, endRow=x2, endColumn=y2};
SelectedMoveIndex = ListOfMoves.Count -1;