我调用静态方法时的参数(网格)给出了一个对象引用所需的错误

时间:2015-04-17 15:55:21

标签: c# .net

编辑时有更好的解释!

我通过C#学习(我是一名学生)并且我自己制作游戏。它是MasterMind。我已经完成了所有代码,但只有一个错误导致无法测试我的代码。

因此,使用调用的函数是静态的,以及方法本身。 我将举一个代码示例,因为我不太了解如何制定问题。

public static void ProcesColors(Models.Rij_Master HuidigConfig, int lengte)
{
    /* first get the control, so we can add changes to it */
    ucRij try = (ucRij) FindChildInGrid(Res, 0, 0);

    switch (lengte)
    {
        ...;
    }
}

他给出了Res的错误,Res是我的xaml页面上网格中的网格。 我已经尝试过ref关键字(在方法参数和方法中参数的定义中),out,static,但这些都不起作用。 错误是:

  

非静态字段,方法或属性需要对象引用

所以我知道它需要一个参考,因为它是一个参考类型,但我不知道如何强迫它。

(顺便说一句,我的网格Res在自定义控件内)

我在网格中找到孩子的方法是:

private static FrameworkElement FindChildInGrid(Grid g, int row, int col)
{
    var childs = g.Children.Cast<FrameworkElement>();
    return childs.Where(x => Grid.GetRow(x) == row && Grid.GetColumn(x) == col).FirstOrDefault();

}

我做过一些研究,有很多关于静态方法,变量等等的信息......但是关于如何实际调用它们的非诺。

我希望我的问题很明确,而且这不是什么愚蠢的事情。 对不起,很长的帖子已经感谢你阅读了,

问候!

(删除了一些东西)

修改::

最好先读到底部,我会问一个定义问题,如果那个问题得到解答,那我就不需要其他所有

所以......从哪里开始...... 我有一个类,MasterMind和一个MasterMind_Row类。我还构建了一些自定义控件(它们都相互嵌套)。

主要思想是,如果用户dubbel点击图例(ucLegend控件)中的颜色元素,则必须更改试用行中的第一个可用颜色。所以我有两件事需要处理,在我的班级MasterMind中我必须将CurrentConfig MasterMind_Row更改为其值,以便类可以检查正确的颜色,并且我必须在自定义控件中更改颜色。

您在Procescolors中看到的代码在我的控件ucGame中。 在那里,它选择位于网格中正确位置的Row控件,并从4个边框更改它的背景。 我通过在RowClass中创建4个公共属性来实现这一点,在setter中它改变了边框的背景。

这在我的代码中都是一个引导,所以你会理解我想要实现的目标。

现在我将为您提供如何实现的代码路径: (在ucLegend中,实现双击的东西):

private void ProcesColor(object sender, DoubleTappedRoutedEventArgs e)
        {
            Border brd = (Border) sender;

            Brush selectColor = brd.Background;

            MasterMind.FillColorsByClick(selectColor);
        }

然后我们转到处理点击的MasterMind类。 这个necesearry是静态的吗?或者可以省略(它会解决所有问题)

public **static** void FillColorsByClick(Brush selectColor)
        {
            if (arrSelectionChoice.Length < 4)
            {
                /* resize array */
                ExpandArray1Pos(arrSelectionChoice);

                /* fill in the array */
                arrSelectonChoice[arrSelectonChoice.Length - 1] = selectColor;

                /* fill the color in on the right property (color1,color2,color3,color4) 
                in the MasterMind_Row CurrentConfig */
                FillElementsInRowObject();

                /* send the currentconfig Row (with it's colors) to the ucLegend control*/
                ucSpel.ProcesColors(HuidigConfig, arrSelectieKeuze.Length);
            }
        }

现在是我之前发布的代码。 在控件 ucGame 中,我们有以下内容:

public **static** void ProcesColors(Models.Rij_Master HuidigConfig, int lengte)
        {
            /* first select rowcontrol to make changes to it */
            ucRij tryout = (ucRij) FindChildInGrid(ref Res, 0, 0);

            switch (lengte)
            {
                case 1:
                tryout.Color1SetBackground = HuidigConfig.Color1;
            case 2:
                tryout.Color1SetBackground = HuidigConfig.Color1;
                tryout.Color2SetBackground = HuidigConfig.Color2;
            case 3:
                tryout.Color1SetBackground = HuidigConfig.Color1;
                tryout.Color2SetBackground = HuidigConfig.Color2;
                tryout.Color3SetBackground = HuidigConfig.Color3;
            case 4:
                tryout.Color1SetBackground = HuidigConfig.Color1;
                tryout.Color2SetBackground = HuidigConfig.Color2;
                tryout.Color3SetBackground = HuidigConfig.Color3;
                tryout.Color4SetBackground = HuidigConfig.Color4;
            }
        }

现在的主要问题是什么,再看看我的代码,是不是他们都拥有静态属性?我知道一旦你做了1静态,你必须使整个链变为静态,但是可以在没有静态的情况下做到这一点吗?

我正在选择元素的网格也在我的ucGame控件中。所以我无法从课堂上或其他任何地方传递它。


我知道这是一个非常长的帖子,我真的很感谢读这篇文章的人。我仍然是一名学习程序员,但我不会变得更好,更专业,因此这个项目是我为自己做的。

我已经在stackoverflow上找到了很多答案,并且我自己也开始成为活跃的成员。我真的很喜欢这个网站。

对于长篇帖子再次抱歉,我希望这不是一个愚蠢的问题..

我真诚地

1 个答案:

答案 0 :(得分:0)

我假设ProcesColors是您已添加到窗口代码隐藏中的功能。

正如您所提到的,问题在于ProcesColors函数是static,而ResGrid的一个实例。在你的页面上。因此,ProcesColors并不知道Res是什么。如果ProcesColors确实应该保留static,那么您需要通过任何代码调用ResProcesColors传递给它。或者,也许ProcesColors不应该是static。如果您发布了调用ProcesColors的函数的代码,我们可能会帮助您进一步提升。