Если вы хотите сделать это по-своему (с таймером), просто измените свой обработчик события отметки таймера на код ниже.Это также изменит размер DataGridView вместе с его положением.
private void timer1_Tick(object sender, EventArgs e)
{
if (hidded)
{
Spanel.Height = Spanel.Height + 20;
Datagridview1.Location = new Point(23, Datagridview1.Location.Y + 20);
Datagridview1.Size = new Size(Datagridview1.Width, Datagridview1.Height - 20);
if (Spanel.Height >= 140)
{
timer1.Stop();
hidded = false;
this.Refresh();
}
}
else
{
Spanel.Height = Spanel.Height - 20;
Datagridview1.Location = new Point(23, Datagridview1.Location.Y - 20);
Datagridview1.Size = new Size(Datagridview1.Width, Datagridview1.Height + 20);
if (Spanel.Height <= 0)
{
timer1.Stop();
hidded = true;
this.Refresh();
}
}
}
Мой подход к этой проблеме будет несколько другим, и если вы не возражаете, я позволю это здесь.Вместо того, чтобы ставить якорь, я делал бы это так (см. Рисунок ниже), используя стыковку.Он должен работать так же, используя код, который вы разместили (ваш SPanel - Panel2 на картинке).
Редактировать # 1: Для плавного перемещения или изменения размера элементов управления в вашем приложении WinForm я рекомендую использовать эту библиотеку: https://github.com/UweKeim/dot-net-transitions. При использовании упомянутой библиотеки ваш обработчик событий нажатия кнопки будет выглядеть примерно такэто:
private bool resizing = false;
private void button1_Click(object sender, EventArgs e)
{
if (resizing)
return;
resizing = true;
Transition t = new Transition(new TransitionType_Acceleration(600));
t.TransitionCompletedEvent += (snd, ea) => { resizing = false; };
t.add(panel2, "Height", panel2.Height == 0 ? 250 : 0);
t.run();
}