C# 如何在C中通过拖放在面板中传递背景色

C# 如何在C中通过拖放在面板中传递背景色,c#,drag-and-drop,C#,Drag And Drop,我们有一个学校项目,我们需要一个C语言的项目策划人。我们用面板来可视化颜色。因此,我们在顶部有行可用颜色和x行数面板来猜测代码。其中X是圈数 我们需要实现一个拖放事件,其中用户将一种可用颜色拖动到猜测行中的面板。例如,用户单击并拖动一个红色到行中的面板,然后该面板的背景颜色需要更改为红色 这就是我到目前为止所做的: #region CreatePanels public void CreatePanelArrayColors(int aantalKleuren) {

我们有一个学校项目,我们需要一个C语言的项目策划人。我们用面板来可视化颜色。因此,我们在顶部有行可用颜色和x行数面板来猜测代码。其中X是圈数

我们需要实现一个拖放事件,其中用户将一种可用颜色拖动到猜测行中的面板。例如,用户单击并拖动一个红色到行中的面板,然后该面板的背景颜色需要更改为红色

这就是我到目前为止所做的:

#region CreatePanels
    public void CreatePanelArrayColors(int aantalKleuren) 
    {
        pa = new Panel[aantalKleuren];
        for (int i = 0; i < pa.Length; i++) {
            pa[i] = new Panel();
            pa[i].Width = 40;
            pa[i].Height = 40;
            pa[i].Top = 18;
            pa[i].Left = 6 + i * 46;
            pa[i].Tag = i;

            pa[i].MouseDown += paAC_MouseDown;


            kleurenToewijzen(pa, (int)pa[i].Tag, i);
            grpAvailColors.Controls.Add(pa[i]);
        }
    }

    public void CreatePanelGuess(int nmbrColorsToGuess)
    {
        pa = new Panel[nmbrColorsToGuess];
        for (rowNumber = 0; rowNumber < g.Turns; rowNumber++)
        {
            for (j = 0; j < pa.Length; j++)
            {

                pa[j] = new Panel();
                pa[j].Width = 30;
                pa[j].Height = 30;
                pa[j].Top = (rowNumber * 30 + rowNumber * 3) + 3;
                pa[j].Left = 3 + j * 36;
                pa[j].BackColor = Color.LightGray;

                pa[j].AllowDrop = true;
                pa[j].DragEnter += paTG_DragEnter;
                pa[j].DragDrop += paTG_DragDrop;

                ActieveTeRadenRij(pa, j, rowNumber);
                pnlColorsToGuess.Controls.Add(pa[j]);
            }

            for (int correctie = 0; correctie < pa.Length; correctie++)
            {

                pa[correctie] = new Panel();
                pa[correctie].Width = 10;
                pa[correctie].Height = 10;
                pa[correctie].Top = (rowNumber * 30 + rowNumber * 3) + 30 / 2 - 1;
                pa[correctie].Left = (3 + g.ColorsGuess * 36) + 10 + correctie * 18;
                pa[correctie].BackColor = Color.Gray;

                pa[correctie].AllowDrop = true;
                pa[correctie].DragEnter += paTG_DragEnter;
                pa[correctie].DragDrop += paTG_DragDrop;

                pnlColorsToGuess.Controls.Add(pa[correctie]);
            }
            //bt[0] = new Button();
            //bt[0].Top = (rowNumber * 50 + rowNumber * 3) + 50 / 2;
            //bt[0].Left = (3 + g.ColorsGuess * 56) + 10 + g.ColorsGuess * 18 + 10;

            //pnlColorsToGuess.Controls.Add(bt[0]);
        }
        CreateTryButton();
    }

    #region DragAndDrop
    private void paTG_DragDrop(object sender, DragEventArgs e)
    {
        ((Panel)e.Data.GetData(typeof(Panel))).Parent = (Panel)sender;
    }
    private void paTG_DragEnter(object sender, DragEventArgs e)
    {
        e.Effect = DragDropEffects.Move;
    }
    private void paAC_MouseDown(object sender, MouseEventArgs e)
    {
        Panel pnl = sender as Panel;
        pnl.DoDragDrop(pnl, DragDropEffects.Move);
    }
    #endregion

问题是,当我们将一个面板拖到一行时,该面板将消失,颜色也不会改变。

尝试这样做:

private void paTG_DragDrop(object sender, DragEventArgs e)
{
    var data = e.Data.GetData(typeof(Color));

    if(data != null)
        ((Panel)sender).BackColor = (Color)data;
}
private void paAC_MouseDown(object sender, MouseEventArgs e)
{
    Panel pnl = sender as Panel;
    if(pnl != null)
        pnl.DoDragDrop(pnl.BackColor, DragDropEffects.Move);
}
与您的代码相比,差异如下:

我在paTG_DragDrop方法中使用Panel类的BackColor属性来更改其颜色。 我使用颜色作为数据进行拖动。 我假设源面板的BackColor属性填充了适当的颜色。如果你有不同的方法,它很容易改变。