Как исправить ошибку cs0123

I’m trying to pass a program name from my form to a button click event. But I keep getting the following error message:

«No overload for “method” matches delegate ‘EventHandler’ «

I’ve read up on similar problems here and tried numerous suggestions but nothing seems to fix my specific problem. I’m hoping someone can tell me where I’m going wrong. Here are some of the posts I’ve read:

No overload for ‘method’ matches delegate ‘System.EventHandler’

C# CS0123: No overload for matches delegate Eventhandler

Error — No overload for «method» matches delegate ‘System.EventHandler’?

I don’t seem to have a clear understanding of how to match up the signatures of my event methods. The documentation I’ve read hasn’t helped. Any assistance from a knowledgeable person would be greatly appreciated.

My code is as follows:

using System;
using System.Windows.Forms;


namespace ProgramOne
{
    public partial class frmLogin : Form
    {
        public frmLogin(string pgmName)
        {
            InitializeComponent();
            Click += (sender, EventArgs) => { BtnSubmit_Click(sender, EventArgs, pgmName); };
        }


        private void BtnSubmit_Click(object sender, EventArgs e, string pgmName)
        {
            txtUserId.Text = txtUserId.Text.Trim();
            txtPassword.Text = txtPassword.Text.Trim();
            if (txtUserId.Text == "" || txtPassword.Text == "")
            {
                MessageBox.Show("Please provide a valid UserID and Password");
                return;
            }

            bool securityCheckPassed = true;
            if (securityCheckPassed)
            {
                //Open new form
                MessageBox.Show(frmLogin.pgmName);
            }
        }
    }
}

LarsTech's user avatar

LarsTech

80.7k14 gold badges153 silver badges225 bronze badges

asked Jun 9, 2021 at 19:03

csharpMind's user avatar

13

LarsTech and Chetan Ranpariya provided excellent suggestions that helped me solve this problem. My solution appears below for other C# newbies like me to use:

using System;
using System.Windows.Forms;

namespace ProgramOne
{
    public partial class frmLogin : Form
    {
        private string pgmName;                      <-- Declare the variable
        public frmLogin(string pgmName)
        {
            InitializeComponent();
            this.pgmName = pgmName;                  <-- Initialize with passed value
        }

        private void BtnSubmit_Click(object sender, EventArgs e)  <-- Remove pgmName from original code above
        {
            txtUserId.Text = txtUserId.Text.Trim();
            txtPassword.Text = txtPassword.Text.Trim();
            if (txtUserId.Text == "" || txtPassword.Text == "")
            {
                MessageBox.Show("Please provide a valid UserID and Password");
                return;
            }

            bool securityCheckPassed = true;
            if (securityCheckPassed)
            {
                //Open new form
                MessageBox.Show(pgmName);           <-- Access the name
            }
        }
    }
}

The program name now shows up in the BtnSubmit_Click event handler for me to use to launch subsequent forms as needed. Just replace «MessageBox.Show(pgmName);» with «GoToForm(frmName);» (replacing the sample name values with your own names).

answered Jun 9, 2021 at 21:14

csharpMind's user avatar

csharpMindcsharpMind

893 silver badges14 bronze badges

I am stuck at an error that I can understand but cannot fix, it’s a CS0123 error where parameters between a method and a delegate do not match. But I looked at my code and it seems to be the right type so I’m confused and ask for your help since I’m learning more advanced C# with this project. This project is about to generate an hex grid and then process an A* pathfinding on it between two hex tiles. I used this serie of written tutorials even if it’s an old one and had to refresh a bit the code to make it work on Unity 5 and more recent version of C# .NET (I guess).

Here are the errors :

Assets/Scripts/GridManager.cs(151,39): error CS0123: A method or delegate ‘GridManager.calcDistance(Tile)’ parameters do not match delegate ‘System.Func()’ parameters

Assets/Scripts/GridManager.cs(153,17): error CS1502: The best overloaded method match for ‘GridManager.DrawPath(System.Collections.Generic.IEnumerable)’ has some invalid arguments

Assets/Scripts/GridManager.cs(153,17): error CS1503: Argument ‘#1’ cannot convert ‘object’ expression to type ‘System.Collections.Generic.IEnumerable’

I’m pretty sure that the two lasts are there only because of the first because it does not recognize the right var type that should be a Tile.

I hope you’ll be able to help me and explain me what I did wrong. I think I do not entirely what’s going on there.

Thank you in advance !

Here is some of my modified code but it’s basically the same as the tutorial :

GridManager.cs :

    double calcDistance(Tile tile)
    {
            Tile destTile = destTileTB.tile;
            float deltaX = Mathf.Abs(destTile.X - tile.X);
            float deltaY = Mathf.Abs(destTile.Y - tile.Y);
            int z1 = -(tile.X + tile.Y);
            int z2 = -(destTile.X + destTile.Y);
            float deltaZ = Mathf.Abs(z2 - z1);

            return Mathf.Max(deltaX, deltaY, deltaZ);
    }

    private void DrawPath(IEnumerable<Tile> path)
    {
            if (this.path == null)
                    this.path = new List<GameObject>();
            this.path.ForEach(Destroy);
            this.path.Clear();

            GameObject lines = GameObject.Find("Lines");
            if (lines == null)
                    lines = new GameObject("Lines");
            foreach (Tile tile in path)
            {
                    var line = (GameObject)Instantiate(Line);
                    Vector2 gridPos = new Vector2(tile.X + tile.Y / 2, tile.Y);
                    line.transform.position = calcWorldCoord(gridPos);
                    this.path.Add(line);
                    line.transform.parent = lines.transform;
            }
    }

    public void generateAndShowPath()
    {
            if (originTileTB == null || destTileTB == null)
            {
                    DrawPath(new List<Tile>());
                    return;
            }
            Func<Tile, Tile, double> distance = (node1, node2) => 1;

            var path = PathFinder.FindPath(originTileTB.tile, destTileTB.tile,
                                           distance, calcDistance); //error is here
            DrawPath(path);
    }

PathFinder.cs:

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;

    public static class PathFinder
    {
    public static Path<Node> FindPath<Node>(
            Node start,
            Node destination,
            Func<Node, Node, double> distance,
            Func<Node> estimate)
            where Node : IHasNeighbours<Tile>
    {
            var closed = new HashSet<Node>();
            var queue = new PriorityQueue<double, Path<Node>>();
            queue.Enqueue(0, new Path<Node>(start));

            while (!queue.IsEmpty)
            {
                    var path = queue.Dequeue();

                    if (closed.Contains(path.LastStep))
                            continue;
                    if (path.LastStep.Equals(destination))
                            return path;

                    closed.Add(path.LastStep);

                    foreach (Node n in path.LastStep.Neighbours)
                    {
                            double d = distance(path.LastStep, n);
                            var newPath = path.AddStep(n, d);
                            queue.Enqueue(newPath.TotalCost + estimate(n), newPath);
                    }
            }

            return null;
    }
    }

Никакая перегрузка не соответствует делегату EventHandler, даже если аргументы в методе обработчика кажутся нормальными

Я очень начинающий программист, пытающийся понять детали обработки событий. И я ломаю голову из-за проблемы. Увидеть ниже:

Этот (сокращенный) фрагмент кода выдает ошибку CS0123 , показывая, что мой метод Knop_Click не соответствует делегату EventHandler .

Я определил, что проблема связана с Knop_ClickEventArgs , потому что если я заменю его на System.EventArgs , он будет работать нормально. Однако, поскольку я указываю в определении Knop_ClickEventArgs , что это конкретный экземпляр System.EventArgs , меня озадачивает, почему это может вызвать проблему?

2 ответа

Вы все неправильно понимаете. вам просто нужен соответствующий обработчик событий, прикрепленный к событию Click.

Теперь этот метод будет вызываться, когда кнопка запускает событие Click. вы не можете изменить подпись, потому что именно так кнопка запускает это событие. что-то вроде этого.

Теперь в Knop_Click вы получаете аргументы, которые только что передал Button.

Что вы ожидаете, если измените подпись? то, что вы хотите, не может быть достигнуто, потому что EventArgs является базовым классом, а Button передает EventArgs, его нельзя преобразовать в производный класс.

Вы должны пояснить, какова ваша цель. уточнить, какой код нужно написать, чтобы мы могли подобрать для него подходящее место

Когда вы добавляете обработчик к событию Click элемента управления (в данном случае Button , который вы вызываете Knop ), Button будет вызывать ваш обработчик, передавая это object sender, System.EventArgs e . Это означает, что:

невозможно определить ваш обработчик как принимающий ваш собственный класс событий вместо System.EventArgs ,

Если бы компилятор позволял вам это делать, у вас были бы настоящие проблемы, потому что Button все равно передавал бы System.EventArgs вашему обработчику, полностью игнорируя ваши пожелания получить вместо этого что-то еще.

Ваш план добавления кода в класс событий говорит мне, что, возможно, вы чего-то не поняли о событиях и передаче событий. Предполагается, что события несут данные, они не должны содержать код.

Как исправить эту ошибку — C# CS0123: перегрузка для «метода» не соответствует делегату «EventHandler»

Я пытаюсь передать имя программы из моей формы в событие нажатия кнопки. Но я продолжаю получать следующее сообщение об ошибке:

«Нет перегрузки для метода» соответствует делегату «EventHandler»

Я читал о подобных проблемах здесь и пробовал множество предложений, но, похоже, ничто не решает мою конкретную проблему. Я надеюсь, что кто-то может сказать мне, где я ошибаюсь. Вот некоторые из сообщений, которые я прочитал:

Кажется, у меня нет четкого понимания того, как сопоставлять сигнатуры моих методов обработки событий. Документация, которую я читал, не помогла. Буду очень признателен за любую помощь знающего человека.

в чем ошибка компиляции??

Добавлено 08.03.11, 14:35

Не удалось найти имя типа или пространства имён «EventHandler»

Добавлено 08.03.11, 14:37
Да, я не знаю как автоматизировать то, чтобы обмен разрешался только соседним кнопкам. Их в принципе всего 16 — так что это не большая проблема.

конечно убрать. нет такого эвента

Что куда передать?? для чего этот аргумент вообще?

Добавлено 08.03.11, 15:02
ужасть ))

у вообще у контролов есть такая штука как Tag, он имеет тип object, а значит туда можно затолкать все что угодно, и использовать в наших целях. Итак:
всем кнопка программно задаем индекс в свойство Tag и попутно подсовываем обработчик нажатия:

Я застрял в ошибке, которую я могу понять, но не могу исправить, это ошибка CS0123, когда параметры между методом и делегатом не совпадают. Но я посмотрел на мой код, и он кажется правильным, поэтому я запутался и прошу вашей помощи, так как я изучаю более продвинутый C# с этим проектом. Этот проект собирается создать шестнадцатеричную сетку, а затем обработать на ней путь A* между двумя шестнадцатеричными плитками. Я использовал эту серию письменных руководств, даже если это старая версия, и мне пришлось немного обновить код, чтобы она работала на Unity 5 и более поздних версиях C# .NET (я полагаю).

Вот ошибки:

Assets / Scripts / GridManager.cs (151,39): ошибка CS0123: метод или делегат «GridManager.calcDistance(Tile)» не соответствуют параметрам делегата «System.Func()»

Assets/Scripts/GridManager.cs(153,17): ошибка CS1502: лучшее совпадение перегруженного метода для ‘GridManager.DrawPath(System.Collections.Generic.IEnumerable)’ имеет недопустимые аргументы

Assets/Scripts/GridManager.cs(153,17): ошибка CS1503: Аргумент ‘#1’ не может преобразовать выражение ‘объекта’ в тип ‘System.Collections.Generic.IEnumerable’

Я почти уверен, что эти два параметра существуют только из-за первого, потому что он не распознает правильный тип var, который должен быть плиткой.

Я надеюсь, что вы сможете мне помочь и объяснить, что я сделал не так. Я думаю, что я не совсем то, что там происходит.

Заранее спасибо!

Вот часть моего модифицированного кода, но он в основном такой же, как и учебник:

GridManager.cs:

    double calcDistance(Tile tile)
    {
            Tile destTile = destTileTB.tile;
            float deltaX = Mathf.Abs(destTile.X - tile.X);
            float deltaY = Mathf.Abs(destTile.Y - tile.Y);
            int z1 = -(tile.X + tile.Y);
            int z2 = -(destTile.X + destTile.Y);
            float deltaZ = Mathf.Abs(z2 - z1);

            return Mathf.Max(deltaX, deltaY, deltaZ);
    }

    private void DrawPath(IEnumerable<Tile> path)
    {
            if (this.path == null)
                    this.path = new List<GameObject>();
            this.path.ForEach(Destroy);
            this.path.Clear();

            GameObject lines = GameObject.Find("Lines");
            if (lines == null)
                    lines = new GameObject("Lines");
            foreach (Tile tile in path)
            {
                    var line = (GameObject)Instantiate(Line);
                    Vector2 gridPos = new Vector2(tile.X + tile.Y / 2, tile.Y);
                    line.transform.position = calcWorldCoord(gridPos);
                    this.path.Add(line);
                    line.transform.parent = lines.transform;
            }
    }

    public void generateAndShowPath()
    {
            if (originTileTB == null || destTileTB == null)
            {
                    DrawPath(new List<Tile>());
                    return;
            }
            Func<Tile, Tile, double> distance = (node1, node2) => 1;

            var path = PathFinder.FindPath(originTileTB.tile, destTileTB.tile,
                                           distance, calcDistance); //error is here
            DrawPath(path);
    }

PathFinder.cs:

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;

    public static class PathFinder
    {
    public static Path<Node> FindPath<Node>(
            Node start,
            Node destination,
            Func<Node, Node, double> distance,
            Func<Node> estimate)
            where Node : IHasNeighbours<Tile>
    {
            var closed = new HashSet<Node>();
            var queue = new PriorityQueue<double, Path<Node>>();
            queue.Enqueue(0, new Path<Node>(start));

            while (!queue.IsEmpty)
            {
                    var path = queue.Dequeue();

                    if (closed.Contains(path.LastStep))
                            continue;
                    if (path.LastStep.Equals(destination))
                            return path;

                    closed.Add(path.LastStep);

                    foreach (Node n in path.LastStep.Neighbours)
                    {
                            double d = distance(path.LastStep, n);
                            var newPath = path.AddStep(n, d);
                            queue.Enqueue(newPath.TotalCost + estimate(n), newPath);
                    }
            }

            return null;
    }
    }

Hi DaveGriss,

Based on my understanding, the keydown event‘s delegate is “void (object, KeyEventArgs)” instead of “void (object, EventArgs)”, the mismatch delegate
parameter that give rise to the error CS0123.

Well, probably you can try to refer to the following code
snippet.

public partial class Form1 : Form

    {

private System.Windows.Forms.TextBox textBox1;

       
public Form1()

       
{

           
InitializeComponent();

this.textBox1 = new System.Windows.Forms.TextBox();

this.textBox1.Location = new System.Drawing.Point(58,
46);

           
this.textBox1.Name = «textBox1»;

           
this.textBox1.Size = new System.Drawing.Size(136,
20);

           
this.textBox1.TabIndex = 3;

           
this.textBox1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.textBox1_KeyDown);

           
this.textBox1.KeyUp += new System.Windows.Forms.KeyEventHandler(this.textBox1_KeyUp);

this.Controls.Add(this.textBox1);

       
}

       
private void
textBox1_KeyDown(object sender, KeyEventArgs e)

       
{

           
if (e.KeyCode == (Keys.Enter))

           
{

                textBox1.Text += «enter down «;

           
}

        }

       
private void
textBox1_KeyUp(object sender, KeyEventArgs e)

       
{

           
if (e.KeyCode == (Keys.Enter))

           
{

                textBox1.Text += «enter up «;

           
}

       
}

    }

Regards,

Xun


Please remember to mark the replies as answers if they help and unmark them if they provide no help.

  • Marked as answer by
    jack 321
    Tuesday, July 15, 2008 10:36 AM

Like this post? Please share to your friends:
  • Как исправить ошибку division by zero
  • Как исправить ошибку cs go exe не отвечает
  • Как исправить ошибку dll 110
  • Как исправить ошибку directx runtime
  • Как исправить ошибку critical process died windows 10