功能不叫

时间:2011-04-23 10:48:15

标签: c#

您好我有以下代码,我在其中调用名为 ControlAdd 的函数,但编译器调试代码直到此函数,但此函数。这是代码:

    void SettingControls()
    {
        for (int i = 0; i < listBox1.Items.Count; i++)
        {
            string[] ListText;
            ListText = listBox1.Items[i].ToString().Split('.');
            if (ListText[0] == ";Control")
            {
                if (ListText[1] == "Form")
                {
                    this.Text = OrganizeData(listBox1.Items[i + 2].ToString().Trim());
                    this.Width = Convert.ToInt16(OrganizeData(listBox1.Items[i + 3].ToString()));
                    this.Height = Convert.ToInt16(OrganizeData(listBox1.Items[i + 4].ToString()));
                    this.Left = Convert.ToInt16(OrganizeData(listBox1.Items[i + 5].ToString()));
                    this.Top = Convert.ToInt16(OrganizeData(listBox1.Items[i + 6].ToString()));
                }
                else
                {
                    string Control_Text;
                    string Control_Name;
                    int Control_Width, Control_Height, Control_Left, Control_Top;
                    Control_Name = OrganizeData(listBox1.Items[i + 2].ToString().Trim());
                    Control_Text = OrganizeData(listBox1.Items[i + 3].ToString().Trim());
                    Control_Width = Convert.ToInt16(OrganizeData(listBox1.Items[i + 4].ToString()));
                    Control_Height = Convert.ToInt16(OrganizeData(listBox1.Items[i + 5].ToString()));
                    Control_Left = Convert.ToInt16(OrganizeData(listBox1.Items[i + 6].ToString()));
                    Control_Top = Convert.ToInt16(OrganizeData(listBox1.Items[i + 7].ToString()));
                    ControlAdd(ListText[1].ToString(), Control_Name, Control_Text, Control_Width, Control_Height, Control_Left, Control_Top);
                }
            }
        }
    }

编译器未调用的函数是:

ControlAdd(ListText[1].ToString(), Control_Name, Control_Text, Control_Width, Control_Height, Control_Left, Control_Top);

编译器调试代码直到这一行:

Control_Top = Convert.ToInt16(OrganizeData(listBox1.Items[i + 7].ToString()));

它只是跳过了这条线。我使用了断点但是程序会停止。编译器会跳过该行,但不会发生异常。 这个程序工作正常,直到我向函数控件add添加一个新参数ControlName。添加参数后,会出现此问题。我也尝试删除我添加的参数,但问题仍然存在。

3 个答案:

答案 0 :(得分:3)

你正在循环:

for (int i = 0; i < listBox1.Items.Count; i++)

你正在访问数组的这个元素:

listBox1.Items[i + 7]

很有可能这超出了数组的末尾,从而引发异常。

您需要更改循环的结束条件,以便i+7是有效的数组索引。

答案 1 :(得分:0)

也许项目调试器的输出文件夹正在寻找程序集与调试程序集不同。

当执行程序集(在调试模式下)与最新的输出程序集不同时,会出现此问题。您可以尝试在代码中放置断点,并查看断点是否有效并可在调试模式下访问。

答案 2 :(得分:0)

我相信你的问题源于你在listBox1重用项目的事实。第一次循环时,您正在查看listBox1.Items[0]listBox1.Items[6]listBox1.Items[7],但在第二个循环中,您正在查看listBox1.Items[1]listBox1.Items[7]listBox1.Items[8]。我想你想要更像这样的东西:

void SettingControls()
{
    for (int i = 0; i < listBox1.Items.Count; i++)
    {
        string[] ListText;
        ListText = listBox1.Items[i].ToString().Split('.');
        if (ListText[0] == ";Control")
        {
            if (ListText[1] == "Form")
            {
                ...
                i+=6;
            }
            else
            {
                ...
                i+=7;
            }
        }
    }
}