• У нас ещё есть ChatGPT/DALLE/VISION. Всё это бесплатно.

Добрый робот идёт на помощь, есть вопрос? Не тяни, да всю суть изложи. ChatGPT

Интересная технология? Нужна ли она нам.

  • Крутая, оставляй пока есть возможность.

    Голосов: 104 94,5%
  • Игрушка на время. Не верю я в эти технологии.

    Голосов: 6 5,5%

  • Всего проголосовало
    110
  • Опрос закрыт .

zuvl

Особенный
Спасибо от Разулы
Регистрация
1 Окт 2019
Сообщения
738
Реакции
2.365
Ra
2.174
@Добрый робот (ChatGPT)
c#
Имеется коллекция
Код:
Dictionary<string, PictureBox> PictureBoxsDict = new Dictionary<string, PictureBox>();
Написал условие. Выскакивает ошибка. Как исправить код чтобы не было ошибки
Код:
if (targetPictureBox.Image == null && targetPictureBox == PictureBoxsDict.ElementAt(j + 15).Value) //Ошибка    CS0021    Не удается применить индексирование через [] к выражению типа "группа методов"
{
    targetPictureBox.Image = droppedImage;
}
j++;
 

Добрый робот (ChatGPT)

Всезнайка
Лелеять и любить
Особенный
Регистрация
27 Фев 2023
Сообщения
1.911
Реакции
313
Ra
255
@Добрый робот (ChatGPT)
c#
Имеется коллекция
Код:
Dictionary<string, PictureBox> PictureBoxsDict = new Dictionary<string, PictureBox>();
Написал условие. Выскакивает ошибка. Как исправить код чтобы не было ошибки
Код:
if (targetPictureBox.Image == null && targetPictureBox == PictureBoxsDict.ElementAt(j + 15).Value) //Ошибка    CS0021    Не удается применить индексирование через [] к выражению типа "группа методов"
{
    targetPictureBox.Image = droppedImage;
}
j++;
Ошибка CS0021 указывает на то, что попытка применить индексирование через оператор [] к выражению типа "группа методов" недопустима. В вашем коде ошибка возникает из-за использования метода ElementAt() для получения элемента словаря PictureBoxsDict.
Для исправления этой ошибки вам нужно использовать индексатор [] для доступа к элементам словаря. Вот исправленный код:csharp
Код:
if (targetPictureBox.Image == null && targetPictureBox == PictureBoxsDict.ElementAt(j + 15).Value)
{
    targetPictureBox.Image = droppedImage;
}
j++;
Измените строку PictureBoxsDict.ElementAt(j + 15).Value на PictureBoxsDict.Values.ElementAt(j + 15), чтобы получить значение элемента словаря по индексу.
Используя индексатор [], вы можете получить значение элемента словаря напрямую по ключу. Вот исправленный код:csharp
Код:
if (targetPictureBox.Image == null && targetPictureBox == PictureBoxsDict.Values.ElementAt(j + 15))
{
    targetPictureBox.Image = droppedImage;
}
j++;
Обратите внимание, что это предполагает, что у вас есть достаточное количество элементов в словаре PictureBoxsDict для получения элемента по индексу j + 15. Убедитесь, что ваша коллекция содержит достаточное количество элементов, чтобы избежать выхода за пределы диапазона.
 

zuvl

Особенный
Спасибо от Разулы
Регистрация
1 Окт 2019
Сообщения
738
Реакции
2.365
Ra
2.174
@Добрый робот (ChatGPT)
c#
После написания кода
Код:
if (targetPictureBox.Image == null && targetPictureBox == PictureBoxsDict.Values.ElementAt(j + 15))
{
    targetPictureBox.Image = droppedImage;
}
Если я стараюсь разместить изображение в другой PictureBox то выскакивает исключение
в этом коде.
Код:
static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1()); // System.ArgumentException: "Недопустимый параметр."

        }
Что делать? Как исправить код?
 

Добрый робот (ChatGPT)

Всезнайка
Лелеять и любить
Особенный
Регистрация
27 Фев 2023
Сообщения
1.911
Реакции
313
Ra
255
@Добрый робот (ChatGPT)
c#
После написания кода
Код:
if (targetPictureBox.Image == null && targetPictureBox == PictureBoxsDict.Values.ElementAt(j + 15))
{
    targetPictureBox.Image = droppedImage;
}
Если я стараюсь разместить изображение в другой PictureBox то выскакивает исключение
в этом коде.
Код:
static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1()); // System.ArgumentException: "Недопустимый параметр."

        }
Что делать? Как исправить код?
Возникновение исключения "System.ArgumentException: Недопустимый параметр" может быть вызвано несколькими возможными причинами. Однако, на основании предоставленного кода, я могу предположить, что проблема может быть связана с операцией сравнения targetPictureBox == PictureBoxsDict.Values.ElementAt(j + 15).
Проверьте следующие моменты:
  • Убедитесь, что targetPictureBox и PictureBoxsDict.Values.ElementAt(j + 15) имеют одинаковый тип данных, то есть оба должны быть объектами типа PictureBox. Если типы не совпадают, операция сравнения будет возвращать false.
  • Убедитесь, что targetPictureBox и PictureBoxsDict.Values.ElementAt(j + 15) не равны null. Если хотя бы один из них равен null, операция сравнения может вызвать исключение.
  • Убедитесь, что PictureBoxsDict содержит элементы, индекс которых достаточно велик, чтобы обеспечить доступ к элементу PictureBoxsDict.Values.ElementAt(j + 15). Если индекс выходит за границы словаря, это может вызвать исключение.
Дополнительно, чтобы избежать исключения при попытке присвоить droppedImage пустому PictureBox (targetPictureBox.Image == null), вы можете добавить проверку droppedImage на null перед присвоением. Например:csharp
Код:
if (targetPictureBox.Image == null && targetPictureBox == PictureBoxsDict.Values.ElementAt(j + 15))
{
    if (droppedImage != null)
    {
        targetPictureBox.Image = droppedImage;
    }
}
Если проблема остается, пожалуйста, предоставьте больше информации о контексте использования исключения, а также более полный код, чтобы я мог помочь вам более точно.
 

zuvl

Особенный
Спасибо от Разулы
Регистрация
1 Окт 2019
Сообщения
738
Реакции
2.365
Ra
2.174
@Добрый робот (ChatGPT)
c#
Имеется коллекция из 20 PictureBox
Код:
Dictionary<string, PictureBox> PictureBoxsDict = new Dictionary<string, PictureBox>();
Написать код. Изображения находятся в других PictureBox этой коллекции.
Кликаем мышкой по изображению. Но перенести изображение можем только в только в один из PictureBox этой коллекции в зависимости от значения переменной j.
 

Добрый робот (ChatGPT)

Всезнайка
Лелеять и любить
Особенный
Регистрация
27 Фев 2023
Сообщения
1.911
Реакции
313
Ra
255
@Добрый робот (ChatGPT)
c#
Имеется коллекция из 20 PictureBox
Код:
Dictionary<string, PictureBox> PictureBoxsDict = new Dictionary<string, PictureBox>();
Написать код. Изображения находятся в других PictureBox этой коллекции.
Кликаем мышкой по изображению. Но перенести изображение можем только в только в один из PictureBox этой коллекции в зависимости от значения переменной j.
Вот пример кода на C#, который реализует описанную вами логику:csharp
Код:
// Создаем коллекцию PictureBox
PictureBox[] pictureBoxes = new PictureBox[20];

// Заполняем коллекцию PictureBox и добавляем их в PictureBoxsDict
Dictionary<string, PictureBox> PictureBoxsDict = new Dictionary<string, PictureBox>();
for (int i = 0; i < pictureBoxes.Length; i++)
{
    pictureBoxes[i] = new PictureBox();
    PictureBoxsDict.Add($"PictureBox{i}", pictureBoxes[i]);

    // Добавляем обработчик события клика мышкой
    pictureBoxes[i].Click += PictureBox_Click;
}

// Обработчик события клика на PictureBox
private void PictureBox_Click(object sender, EventArgs e)
{
    PictureBox clickedPictureBox = (PictureBox)sender; // Получаем PictureBox, на который кликнули

    int j = 5; // Пример значения переменной j

    // Переносим изображение в PictureBox с индексом j
    if (PictureBoxsDict.ContainsKey($"PictureBox{j}"))
    {
        PictureBox targetPictureBox = PictureBoxsDict[$"PictureBox{j}"];
        targetPictureBox.Image = clickedPictureBox.Image;
        clickedPictureBox.Image = null;
    }
}
В приведенном коде создается коллекция из 20 PictureBox (pictureBoxes), которая затем добавляется в словарь PictureBoxsDict с ключами "PictureBox0", "PictureBox1", и так далее. Затем добавляется обработчик события клика мышкой (PictureBox_Click) для каждого PictureBox.
В обработчике события PictureBox_Click получаем PictureBox, на который кликнули, и определяем значение переменной j (в данном примере значение j установлено равным 5). Затем проверяем наличие PictureBox с индексом j в словаре PictureBoxsDict. Если PictureBox с таким ключом существует, переносим изображение из кликнутого PictureBox в целевой PictureBox с индексом j, а затем очищаем изображение кликнутого PictureBox.
Обратите внимание, что вы можете адаптировать этот код под свои потребности, изменяя количество PictureBox, значения переменной j и другие детали, чтобы он соответствовал вашим требованиям.
 

zuvl

Особенный
Спасибо от Разулы
Регистрация
1 Окт 2019
Сообщения
738
Реакции
2.365
Ra
2.174
@Добрый робот (ChatGPT)
c#
Имеется коллекция из 20 PictureBox
Код:
Dictionary<string, PictureBox> PictureBoxsDict = new Dictionary<string, PictureBox>();
Эта коллекция собирается таким образом
Код:
// Получаем массив из путей и картинок
            foreach (Control ctrl in this.Controls)
            {
                if (ctrl is System.Windows.Forms.GroupBox groupBox && groupBox.Name == "groupBox2")
                {
                    foreach (Control ctrl2 in groupBox.Controls)
                    {
                        if (ctrl2 is PictureBox pb)
                        {
                            AssignPictureBoxProperties(pb);
                        }
                    }
                }
                else if (ctrl is System.Windows.Forms.GroupBox groupBox1 && groupBox1.Name == "groupBox1")
                {
                    foreach (Control ctrl2 in groupBox1.Controls)
                    {
                        if (ctrl2 is PictureBox PictureBox)
                        {
                            AssignPictureBoxProperties(PictureBox);
                        }
                    }
                    foreach (Control ctrl2 in groupBox3.Controls)
                    {
                        if (ctrl2 is PictureBox PictureBox)
                        {
                            AssignPictureBoxProperties(PictureBox);
                            PictureBox.DragDrop += pictureBox_DragDrop;
                        }
                    }
                }
            }
Свойства приписываются через AssignPictureBoxProperties(PictureBox); по такому коду
Код:
 private void AssignPictureBoxProperties(PictureBox pictureBox)
        {
            PictureBoxsDict[pictureBox.Name] = pictureBox;
            pictureBox.AllowDrop = true;        
            pictureBox.DragEnter += pictureBox_DragEnter;//+          
            pictureBox.MouseDown += pictureBox_MouseDown;//+
            pictureBox.MouseEnter += pictureBox_MouseEnter;//+
            pictureBox.MouseLeave += pictureBox_MouseLeave;//+
            // Добавляем обработчик события клика мышкой
            pictureBox.Click += PictureBox_Click;
        }
По коду условие
Код:
if (PictureBoxsDict.ContainsKey($"PictureBox{j + 15}"))
не true.
Как перенести изображение только в один определённый PictureBox

Код:
// Переносим изображение в PictureBox с индексом j
                if (PictureBoxsDict.ContainsKey($"PictureBox{j + 15}"))
                {
                    targetPictureBox = PictureBoxsDict[$"PictureBox{j + 15}"];
                    targetPictureBox.Image = droppedImage;
                    label2.Text = (j + 1).ToString();
                    j++;
                }
В другие PictureBox изображение перенести нельзя.
 

Добрый робот (ChatGPT)

Всезнайка
Лелеять и любить
Особенный
Регистрация
27 Фев 2023
Сообщения
1.911
Реакции
313
Ra
255
@Добрый робот (ChatGPT)
c#
Имеется коллекция из 20 PictureBox
Код:
Dictionary<string, PictureBox> PictureBoxsDict = new Dictionary<string, PictureBox>();
Эта коллекция собирается таким образом
Код:
// Получаем массив из путей и картинок
            foreach (Control ctrl in this.Controls)
            {
                if (ctrl is System.Windows.Forms.GroupBox groupBox && groupBox.Name == "groupBox2")
                {
                    foreach (Control ctrl2 in groupBox.Controls)
                    {
                        if (ctrl2 is PictureBox pb)
                        {
                            AssignPictureBoxProperties(pb);
                        }
                    }
                }
                else if (ctrl is System.Windows.Forms.GroupBox groupBox1 && groupBox1.Name == "groupBox1")
                {
                    foreach (Control ctrl2 in groupBox1.Controls)
                    {
                        if (ctrl2 is PictureBox PictureBox)
                        {
                            AssignPictureBoxProperties(PictureBox);
                        }
                    }
                    foreach (Control ctrl2 in groupBox3.Controls)
                    {
                        if (ctrl2 is PictureBox PictureBox)
                        {
                            AssignPictureBoxProperties(PictureBox);
                            PictureBox.DragDrop += pictureBox_DragDrop;
                        }
                    }
                }
            }
Свойства приписываются через AssignPictureBoxProperties(PictureBox); по такому коду
Код:
 private void AssignPictureBoxProperties(PictureBox pictureBox)
        {
            PictureBoxsDict[pictureBox.Name] = pictureBox;
            pictureBox.AllowDrop = true;        
            pictureBox.DragEnter += pictureBox_DragEnter;//+          
            pictureBox.MouseDown += pictureBox_MouseDown;//+
            pictureBox.MouseEnter += pictureBox_MouseEnter;//+
            pictureBox.MouseLeave += pictureBox_MouseLeave;//+
            // Добавляем обработчик события клика мышкой
            pictureBox.Click += PictureBox_Click;
        }
По коду условие
Код:
if (PictureBoxsDict.ContainsKey($"PictureBox{j + 15}"))
не true.
Как перенести изображение только в один определённый PictureBox

Код:
// Переносим изображение в PictureBox с индексом j
                if (PictureBoxsDict.ContainsKey($"PictureBox{j + 15}"))
                {
                    targetPictureBox = PictureBoxsDict[$"PictureBox{j + 15}"];
                    targetPictureBox.Image = droppedImage;
                    label2.Text = (j + 1).ToString();
                    j++;
                }
В другие PictureBox изображение перенести нельзя.
Похоже, что у вас есть коллекция PictureBox, представленная в виде словаря PictureBoxsDict, и вы хотите перенести изображение только в определенный PictureBox, используя указанный код. Однако, по вашему описанию, условие if (PictureBoxsDict.ContainsKey($"PictureBox{j + 15}")) не срабатывает как ожидается.
Возможны несколько причин, почему условие может не выполняться:
  • Неправильное имя PictureBox: Убедитесь, что вы используете правильное имя для PictureBox, когда добавляете его в словарь PictureBoxsDict. Убедитесь, что имя соответствует ожидаемому имени "PictureBox{j + 15}".
  • Неправильное имя GroupBox: Условие groupBox.Name == "groupBox2" и groupBox1.Name == "groupBox1" предполагают, что у вас есть GroupBox с такими именами в контейнере формы. Убедитесь, что имена GroupBox соответствуют ожидаемым значениям.
  • Проверка выполняется в неправильном месте: Убедитесь, что код проверки наличия PictureBox в словаре выполняется в нужном контексте. Он должен быть выполнен после того, как все PictureBox были добавлены в словарь.
Для более точного определения причины проблемы, вам может потребоваться добавить дополнительные отладочные выводы, чтобы убедиться, что имена PictureBox и GroupBox правильные и что код проверки выполняется в нужном месте.
 

zuvl

Особенный
Спасибо от Разулы
Регистрация
1 Окт 2019
Сообщения
738
Реакции
2.365
Ra
2.174
@Добрый робот (ChatGPT)
c#
Словарь PictureBoxsDict содержит 20 PictureBox. Как проверить правильность написания имени PictureBox при добавлении в коллекцию по коду и сравнить его с таким написанием $"PictureBox{j + 15}"
Код:
foreach (Control ctrl in this.Controls)
            {
                if (ctrl is System.Windows.Forms.GroupBox groupBox && groupBox.Name == "groupBox2")
                {
                    foreach (Control ctrl2 in groupBox.Controls)
                    {
                        if (ctrl2 is PictureBox pb)
                        {
                            AssignPictureBoxProperties(pb);
                        }
                    }
                }
                else if (ctrl is System.Windows.Forms.GroupBox groupBox1 && groupBox1.Name == "groupBox1")
                {
                    foreach (Control ctrl2 in groupBox1.Controls)
                    {
                        if (ctrl2 is PictureBox PictureBox)
                        {
                            AssignPictureBoxProperties(PictureBox);
                        }
                    }
                    foreach (Control ctrl2 in groupBox3.Controls)
                    {
                        if (ctrl2 is PictureBox PictureBox)
                        {
                            AssignPictureBoxProperties(PictureBox);
                            PictureBox.DragDrop += pictureBox_DragDrop;
                        }
                    }
                }
            }
 

zuvl

Особенный
Спасибо от Разулы
Регистрация
1 Окт 2019
Сообщения
738
Реакции
2.365
Ra
2.174
@Добрый робот (ChatGPT)
c#
В результате действия этого кода изображение заноситься в помеченный pictureBox стоит только отпустить мышку.
Код:
// Переносим изображение в PictureBox с индексом j
                if (PictureBoxsDict.ContainsKey($"pictureBox{j + 15}"))
                {
                    targetPictureBox = PictureBoxsDict[$"pictureBox{j + 15}"];
                    targetPictureBox.Image = droppedImage;
                    label2.Text = (j + 1).ToString();
                    j++;
                }
Мне надо чтобы только тогда изображение перемещалось в целевой pictureBox когда этот целевой picturеBox был под мышкой. А иначе переноса бы не было. Выскакивало сообщение что это не тот pictureBox.
 

Добрый робот (ChatGPT)

Всезнайка
Лелеять и любить
Особенный
Регистрация
27 Фев 2023
Сообщения
1.911
Реакции
313
Ra
255
@Добрый робот (ChatGPT)
c#
В результате действия этого кода изображение заноситься в помеченный pictureBox стоит только отпустить мышку.
Код:
// Переносим изображение в PictureBox с индексом j
                if (PictureBoxsDict.ContainsKey($"pictureBox{j + 15}"))
                {
                    targetPictureBox = PictureBoxsDict[$"pictureBox{j + 15}"];
                    targetPictureBox.Image = droppedImage;
                    label2.Text = (j + 1).ToString();
                    j++;
                }
Мне надо чтобы только тогда изображение перемещалось в целевой pictureBox когда этот целевой picturеBox был под мышкой. А иначе переноса бы не было. Выскакивало сообщение что это не тот pictureBox.
Для реализации перемещения изображения только в случае, когда целевой PictureBox находится под указателем мыши, вам понадобится использовать обработчики событий мыши. Вот пример кода на C#, который может помочь вам достичь желаемого поведения:csharp
Код:
// Обработчик события MouseDown для исходного PictureBox
private void sourcePictureBox_MouseDown(object sender, MouseEventArgs e)
{
    // Запоминаем исходный PictureBox и его изображение
    PictureBox sourcePictureBox = (PictureBox)sender;
    Image sourceImage = sourcePictureBox.Image;

    // Проверяем, находится ли указатель мыши над целевым PictureBox
    PictureBox targetPictureBox = GetPictureBoxUnderMouse();
    if (targetPictureBox != null)
    {
        // Переносим изображение в целевой PictureBox
        targetPictureBox.Image = sourceImage;
        label2.Text = (j + 1).ToString();
        j++;
    }
}

// Метод для определения PictureBox, находящегося под указателем мыши
private PictureBox GetPictureBoxUnderMouse()
{
    foreach (Control control in Controls)
    {
        PictureBox pictureBox = control as PictureBox;
        if (pictureBox != null && pictureBox.ClientRectangle.Contains(pictureBox.PointToClient(MousePosition)))
        {
            // Найден PictureBox, находящийся под указателем мыши
            return pictureBox;
        }
    }

    return null;
}
В этом примере предполагается, что у вас есть обработчик события MouseDown для исходного PictureBox, который вызывается при нажатии кнопки мыши на нём. В этом обработчике мы проверяем, находится ли указатель мыши над целевым PictureBox с помощью метода GetPictureBoxUnderMouse(). Если указатель находится над целевым PictureBox, то мы переносим изображение из исходного PictureBox в целевой PictureBox.
Пожалуйста, убедитесь, что вы назначили обработчик MouseDown для вашего исходного PictureBox. Также не забудьте добавить целевые PictureBox на форму и установить соответствующие их имена и индексы в словарь PictureBoxsDict.
Примечание: Вам также может понадобиться добавить обработчик события MouseUp для исходного PictureBox, чтобы обеспечить сброс изображения в случае, если мышь была отпущена вне целевого PictureBox.
 

zuvl

Особенный
Спасибо от Разулы
Регистрация
1 Окт 2019
Сообщения
738
Реакции
2.365
Ra
2.174
@Добрый робот (ChatGPT)
c#
В результате действия этого кода изображение заноситься в помеченный pictureBox стоит только отпустить мышку
Код:
// Переносим изображение в PictureBox с индексом j
                if (PictureBoxsDict.ContainsKey($"pictureBox{j + 15}"))
                {
                    targetPictureBox = PictureBoxsDict[$"pictureBox{j + 15}"];
                    targetPictureBox.Image = droppedImage;
                    label2.Text = (j + 1).ToString();
                    j++;
                }
Мне надо чтобы только тогда изображение перемещалось в целевой pictureBox когда этот целевой picturеBox был под мышкой. А иначе переноса бы не было. Выскакивало сообщение что это не тот pictureBox.
Целевой pictureBox определяется как pictureBox{j + 15} в словаре PictureBoxsDict как в коде выше.
 

Добрый робот (ChatGPT)

Всезнайка
Лелеять и любить
Особенный
Регистрация
27 Фев 2023
Сообщения
1.911
Реакции
313
Ra
255
@Добрый робот (ChatGPT)
c#
В результате действия этого кода изображение заноситься в помеченный pictureBox стоит только отпустить мышку
Код:
// Переносим изображение в PictureBox с индексом j
                if (PictureBoxsDict.ContainsKey($"pictureBox{j + 15}"))
                {
                    targetPictureBox = PictureBoxsDict[$"pictureBox{j + 15}"];
                    targetPictureBox.Image = droppedImage;
                    label2.Text = (j + 1).ToString();
                    j++;
                }
Мне надо чтобы только тогда изображение перемещалось в целевой pictureBox когда этот целевой picturеBox был под мышкой. А иначе переноса бы не было. Выскакивало сообщение что это не тот pictureBox.
Целевой pictureBox определяется как pictureBox{j + 15} в словаре PictureBoxsDict как в коде выше.
Для достижения желаемого поведения, вам необходимо добавить обработчики событий мыши для каждого целевого pictureBox. При перемещении мыши, проверяйте, находится ли курсор над определенным pictureBox. Если это так, то вы можете выполнить код для перемещения изображения в этот pictureBox. В противном случае просто игнорируйте перемещение.
Вот пример, демонстрирующий это:csharp
Код:
// Добавьте обработчики событий мыши для каждого целевого pictureBox
foreach (var pictureBox in PictureBoxsDict.Values)
{
    pictureBox.MouseMove += PictureBox_MouseMove;
    pictureBox.MouseUp += PictureBox_MouseUp;
}

// Обработчик события MouseMove для каждого целевого pictureBox
private void PictureBox_MouseMove(object sender, MouseEventArgs e)
{
    PictureBox pictureBox = (PictureBox)sender;

    if (e.Button == MouseButtons.Left && pictureBox.Capture)
    {
        // Ваш код для перемещения изображения в текущий pictureBox
        pictureBox.Image = droppedImage;
    }
}

// Обработчик события MouseUp для каждого целевого pictureBox
private void PictureBox_MouseUp(object sender, MouseEventArgs e)
{
    PictureBox pictureBox = (PictureBox)sender;
    pictureBox.Capture = false;
}
В этом примере мы добавляем обработчики событий MouseMove и MouseUp для каждого pictureBox из словаря PictureBoxsDict. В обработчике MouseMove мы проверяем, что левая кнопка мыши нажата и pictureBox захвачен. Если оба условия выполняются, мы перемещаем изображение в текущий pictureBox. В обработчике MouseUp мы снимаем захват с pictureBox.
Пожалуйста, обратите внимание, что пример предполагает, что код выполняется в контексте Windows Forms или подобного фреймворка, где доступны соответствующие классы MouseEventArgs и PictureBox. Если вы используете другой фреймворк или платформу, вам может потребоваться адаптировать этот код под свои нужды.
 

zuvl

Особенный
Спасибо от Разулы
Регистрация
1 Окт 2019
Сообщения
738
Реакции
2.365
Ra
2.174
@Добрый робот (ChatGPT)
c#
Покажи где в этом коде целевой pictureBox{j+15}
Код:
// Добавьте обработчики событий мыши для каждого целевого pictureBox
foreach (var pictureBox in PictureBoxsDict.Values)
{
    pictureBox.MouseMove += PictureBox_MouseMove;
    pictureBox.MouseUp += PictureBox_MouseUp;
}

// Обработчик события MouseMove для каждого целевого pictureBox
private void PictureBox_MouseMove(object sender, MouseEventArgs e)
{
    PictureBox pictureBox = (PictureBox)sender;

    if (e.Button == MouseButtons.Left && pictureBox.Capture)
    {
        // Ваш код для перемещения изображения в текущий pictureBox
        pictureBox.Image = droppedImage;
    }
}

// Обработчик события MouseUp для каждого целевого pictureBox
private void PictureBox_MouseUp(object sender, MouseEventArgs e)
{
    PictureBox pictureBox = (PictureBox)sender;
    pictureBox.Capture = false;
}
 

Добрый робот (ChatGPT)

Всезнайка
Лелеять и любить
Особенный
Регистрация
27 Фев 2023
Сообщения
1.911
Реакции
313
Ra
255
@Добрый робот (ChatGPT)
c#
Покажи где в этом коде целевой pictureBox{j+15}
Код:
// Добавьте обработчики событий мыши для каждого целевого pictureBox
foreach (var pictureBox in PictureBoxsDict.Values)
{
    pictureBox.MouseMove += PictureBox_MouseMove;
    pictureBox.MouseUp += PictureBox_MouseUp;
}

// Обработчик события MouseMove для каждого целевого pictureBox
private void PictureBox_MouseMove(object sender, MouseEventArgs e)
{
    PictureBox pictureBox = (PictureBox)sender;

    if (e.Button == MouseButtons.Left && pictureBox.Capture)
    {
        // Ваш код для перемещения изображения в текущий pictureBox
        pictureBox.Image = droppedImage;
    }
}

// Обработчик события MouseUp для каждого целевого pictureBox
private void PictureBox_MouseUp(object sender, MouseEventArgs e)
{
    PictureBox pictureBox = (PictureBox)sender;
    pictureBox.Capture = false;
}
В данном коде целевой pictureBox с именем "pictureBox{j+15}" не явно указан. Вместо этого, в цикле foreach обработчики событий мыши (MouseMove и MouseUp) добавляются для каждого pictureBox, находящегося в словаре PictureBoxsDict.Values.
Чтобы найти код, который связывает pictureBox с именем "pictureBox{j+15}" с обработчиками событий, необходимо проверить код, предшествующий представленному фрагменту. Возможно, там содержится информация о создании и добавлении таких pictureBox в словарь PictureBoxsDict.
 

zuvl

Особенный
Спасибо от Разулы
Регистрация
1 Окт 2019
Сообщения
738
Реакции
2.365
Ra
2.174
@Добрый робот (ChatGPT)
c#
В результате действия этого кода изображение заноситься в помеченный pictureBox(j+15) стоит только отпустить мышку
Код:
// Переносим изображение в PictureBox с индексом j
                if (PictureBoxsDict.ContainsKey($"pictureBox{j + 15}"))
                {
                    targetPictureBox = PictureBoxsDict[$"pictureBox{j + 15}"];
                    targetPictureBox.Image = droppedImage;
                    label2.Text = (j + 1).ToString();
                    j++;
                }
Мне надо чтобы только тогда изображение перемещалось в целевой pictureBox(j+15) когда этот целевой picturеBox(j+15) был под мышкой. А иначе переноса бы не было. Выскакивало сообщение что это не тот pictureBox(j+15).
Целевой pictureBox определяется как pictureBox{j + 15} в словаре PictureBoxsDict как в коде выше.
 

Добрый робот (ChatGPT)

Всезнайка
Лелеять и любить
Особенный
Регистрация
27 Фев 2023
Сообщения
1.911
Реакции
313
Ra
255
@Добрый робот (ChatGPT)
c#
В результате действия этого кода изображение заноситься в помеченный pictureBox стоит только отпустить мышку
Код:
// Переносим изображение в PictureBox с индексом j
                if (PictureBoxsDict.ContainsKey($"pictureBox{j + 15}"))
                {
                    targetPictureBox = PictureBoxsDict[$"pictureBox{j + 15}"];
                    targetPictureBox.Image = droppedImage;
                    label2.Text = (j + 1).ToString();
                    j++;
                }
Мне надо чтобы только тогда изображение перемещалось в целевой pictureBox(j+15) когда этот целевой picturеBox был под мышкой. А иначе переноса бы не было. Выскакивало сообщение что это не тот pictureBox.
Целевой pictureBox определяется как pictureBox{j + 15} в словаре PictureBoxsDict как в коде выше.
Для того чтобы проверить, находится ли мышка над целевым PictureBox, можно использовать события MouseEnter и MouseLeave этого элемента управления. Вот как можно изменить ваш код, чтобы изображение перемещалось только в том случае, если мышка находится над целевым PictureBox:csharp
Код:
// Добавьте обработчики событий MouseEnter и MouseLeave для каждого целевого PictureBox
for (int i = 15; i < 30; i++) // Замените 30 на нужное количество PictureBox
{
    var targetPictureBox = PictureBoxsDict[$"pictureBox{i}"];
    targetPictureBox.MouseEnter += PictureBox_MouseEnter;
    targetPictureBox.MouseLeave += PictureBox_MouseLeave;
}

// Обработчик события MouseEnter
private void PictureBox_MouseEnter(object sender, EventArgs e)
{
    var targetPictureBox = (PictureBox)sender;
    targetPictureBox.DoDragDrop(droppedImage, DragDropEffects.Move);
}

// Обработчик события MouseLeave
private void PictureBox_MouseLeave(object sender, EventArgs e)
{
    var targetPictureBox = (PictureBox)sender;
    targetPictureBox.Image = null;
    label2.Text = string.Empty;
    j = 0; // Сброс счетчика
}
В этом коде мы добавляем обработчики событий MouseEnter и MouseLeave для каждого целевого PictureBox. В обработчике MouseEnter мы начинаем операцию перетаскивания (DoDragDrop), передавая изображение droppedImage в качестве перетаскиваемых данных. В обработчике MouseLeave мы сбрасываем изображение и счетчик j, когда мышка покидает целевой PictureBox.
При такой реализации изображение будет перемещаться только тогда, когда мышка находится над целевым PictureBox, и будет сбрасываться, когда мышка покидает его.
 

zuvl

Особенный
Спасибо от Разулы
Регистрация
1 Окт 2019
Сообщения
738
Реакции
2.365
Ra
2.174
@Добрый робот (ChatGPT)
c#
В результате действия этого кода для вставки изображения доступны pictureBox с pictureBox15 до pictureBox30. А мне надо чтобы был доступен только один pictureBox{j+15}. А в остальные pictureBox вставка изображения была бы не доступна
Код:
// Добавьте обработчики событий MouseEnter и MouseLeave для каждого целевого PictureBox
for (int i = 15; i < 30; i++) // Замените 30 на нужное количество PictureBox
{
    var targetPictureBox = PictureBoxsDict[$"pictureBox{i}"];
    targetPictureBox.MouseEnter += PictureBox_MouseEnter;
    targetPictureBox.MouseLeave += PictureBox_MouseLeave;
}

// Обработчик события MouseEnter
private void PictureBox_MouseEnter(object sender, EventArgs e)
{
    var targetPictureBox = (PictureBox)sender;
    targetPictureBox.DoDragDrop(droppedImage, DragDropEffects.Move);
}

// Обработчик события MouseLeave
private void PictureBox_MouseLeave(object sender, EventArgs e)
{
    var targetPictureBox = (PictureBox)sender;
    targetPictureBox.Image = null;
    label2.Text = string.Empty;
    j = 0; // Сброс счетчика
}
 

Добрый робот (ChatGPT)

Всезнайка
Лелеять и любить
Особенный
Регистрация
27 Фев 2023
Сообщения
1.911
Реакции
313
Ra
255
@Добрый робот (ChatGPT)
c#
В результате действия этого кода для вставки изображения доступны pictureBox с pictureBox15 до pictureBox30. А мне надо чтобы был доступен только один pictureBox{j+15}. А в остальные pictureBox вставка изображения была бы не доступна
Код:
// Добавьте обработчики событий MouseEnter и MouseLeave для каждого целевого PictureBox
for (int i = 15; i < 30; i++) // Замените 30 на нужное количество PictureBox
{
    var targetPictureBox = PictureBoxsDict[$"pictureBox{i}"];
    targetPictureBox.MouseEnter += PictureBox_MouseEnter;
    targetPictureBox.MouseLeave += PictureBox_MouseLeave;
}

// Обработчик события MouseEnter
private void PictureBox_MouseEnter(object sender, EventArgs e)
{
    var targetPictureBox = (PictureBox)sender;
    targetPictureBox.DoDragDrop(droppedImage, DragDropEffects.Move);
}

// Обработчик события MouseLeave
private void PictureBox_MouseLeave(object sender, EventArgs e)
{
    var targetPictureBox = (PictureBox)sender;
    targetPictureBox.Image = null;
    label2.Text = string.Empty;
    j = 0; // Сброс счетчика
}
Чтобы сделать доступным только один pictureBox, а остальные оставить недоступными для вставки изображения, вам нужно удалить цикл for и обработчики событий для всех pictureBox, кроме одного. Вместо этого добавьте обработчики событий только для нужного pictureBox.
Вот пример, как это можно сделать для pictureBox15:csharp
Код:
// Добавьте обработчики событий MouseEnter и MouseLeave только для pictureBox15
var targetPictureBox = PictureBoxsDict["pictureBox15"];
targetPictureBox.MouseEnter += PictureBox_MouseEnter;
targetPictureBox.MouseLeave += PictureBox_MouseLeave;
Остальные pictureBox не будут иметь обработчиков событий MouseEnter и MouseLeave, поэтому вставка изображения в них не будет доступна.
 

zuvl

Особенный
Спасибо от Разулы
Регистрация
1 Окт 2019
Сообщения
738
Реакции
2.365
Ra
2.174
@Добрый робот (ChatGPT)
c#
Напиши код когда мы сравниваем pictureBox который под мышкой с pictureBox{j+15} если они совпадают тогда можно вставлять изображение. Если не совпадают тогда сообщаем что это не тот pictureBox и отменяем перетаскивание. Желательно с использованием частей этого кода.
Код:
if (PictureBoxsDict.ContainsKey($"pictureBox{j + 15}"))
                {
                    targetPictureBox = PictureBoxsDict[$"pictureBox{j + 15}"];
                    targetPictureBox.Image = droppedImage;
                   /* label2.Text = (j + 1).ToString();
                    j++;*/
                }
 

Теги по которым нашли тему

  1. chatgpt
  2. шишонин
  3. робот
  4. Написать игру
  5. Хроники Акаши
  6. опционы
  7. Таро
  8. растяжка
  9. Крадник
  10. амигуруми
Сверху