Используйте событие ColumnPositionChanged, однако вам необходимо убедиться, что вы используете условия.Ваша проблема в том, что вы устанавливаете VisibleIndex независимо от того, нужно вам это или нет, так как вы продолжаете изменять положение столбца, в котором событие продолжает срабатывать, и, следовательно, помещает событие в вечный цикл (который представляет собой StackOverflow)
Попробуйте что-то вроде этого
private void gridView1_ColumnPositionChanged(object sender, EventArgs e)
{
if ((colMail1Check.VisibleIndex - colMail1.VisibleIndex) != 1)
{
colMail1Check.VisibleIndex = colMail1.VisibleIndex + 1;
}
if ((colMail2Check.VisibleIndex - colMail2.VisibleIndex) != 1)
{
colMail2Check.VisibleIndex = colMail2.VisibleIndex + 1;
}
}
Что это будет делать, это проверять, находится ли столбец Проверка рядом со своим «основным» столбцом, и если нет, настроить VisibleIndex, чтобы он находился рядом с основным столбцом.Это также будет обрабатываться, если кто-то перетаскивает столбец между двумя столбцами (т. Е. Вы перетаскиваете столбец Mail2 между столбцами Mail1 и Mail1Check, поскольку Mail2Check будет перемещен рядом с Mail2, а Mail1Check снова будет перемещен рядом с Mail1, обеспечиваяэто всегда рядом с колонкой.
Надеюсь, это поможет