1

を取得していStackOverflowExceptionます。どういうわけか、ここに投稿するのが適切に思えました。

C# アプリケーションで Windows フォームを使用しています。このアプリケーションは、Linux、FreeBSD、および Mac-OS で実行することを目的としているため、WPF は使用できません。推奨しないでください。

私の推測では、WinForms のニュアンスが欠けていると思いますが、何がわからないようです。

ComboBox、VS 2010 の GUI フォーム ビルダーによって生成されます。

エラーをスローしている特定のコード行は次のとおりです。

if(cur_num_is_valid)
{
    cbx_material_num.Text = num;
}
else
{
    num = "0";
    //I only have one of the following two at a time. Both overflow
    cbx_material_num.SelectedIndex = 0;
    cbx_material_num.Text = "0";
}

コードはやや複雑なので、関数コード全体を次に示します。'cbx_' はコンボ ボックスを示します。「txtb_」はテキストボックスです。

private void cbx_material_numobj_SelectedIndexChanged(object sender, EventArgs e)
{
    string obj = cbx_material_obj.Text;
    string num = cbx_material_num.Text;
    int selnum = 0;
    int n = 0;

    //do we need to recreate the numbers array?
    bool cur_num_is_valid = false;
    cbx_material_num.Items.Clear();
    if(obj != lastobj)
    {
        n = m_demo.get_object_modifiers(obj);
        for(int i = 0; i <= n; i++)
        {
            string s = i.ToString();
            if(s == num && i < n) cur_num_is_valid = true;
            cbx_material_num.Items.Add(s);
        }
    }
    if(cur_num_is_valid)
    {
        cbx_material_num.Text = num;
    }
    else
    {
        num = "0";
        //Overflow here:
        cbx_material_num.SelectedIndex = 0;
    }

    try
    {
        selnum = int.Parse(num);
    }
    catch(Exception)
    {
        MessageBox.Show("Error, second select menu after 'object modifiers' must be a number, not '"+num+"'.");
        cbx_material_num.Text="0";
        return;
    }

    if(selnum >= n)
    {
        txtb_material_param1.Text = "0";
        txtb_material_param2.Text = "0";
        txtb_material_param3.Text = "0";
        txtb_material_param4.Text = "0";
    }
    else
    {
        MaterialFace face;
        MaterialParameter parameter;
        int typeid;
        object paramdata;
        m_demo.get_object_modifiers_material(obj, selnum, out face, out parameter, out typeid, out paramdata);
        cbx_material_face.Text = face.ToString();
        cbx_material_paramtype.Text = parameter.ToString();
        switch(typeid)
        {
            case 0:
                txtb_material_param1.Text = ((float)paramdata).ToString();
                cbx_material_datatype.Text = "float";
                goto case -1;
            case 1:
                float[] parsf = ((float[])paramdata);
                txtb_material_param1.Text = parsf[0].ToString();
                txtb_material_param2.Text = parsf[1].ToString();
                txtb_material_param3.Text = parsf[2].ToString();
                txtb_material_param4.Text = parsf[3].ToString();
                cbx_material_datatype.Text = "float[]";
                break;
            case 2:
                txtb_material_param1.Text = ((int)paramdata).ToString();
                cbx_material_datatype.Text = "int";
                goto case -1;
            case 3:
                int[] parsi = ((int[])paramdata);
                txtb_material_param1.Text = parsi[0].ToString();
                txtb_material_param2.Text = parsi[1].ToString();
                txtb_material_param3.Text = parsi[2].ToString();
                txtb_material_param4.Text = parsi[3].ToString();
                cbx_material_datatype.Text = "int[]";
                break;
            case -1: //can't actuall be returned, used to 'blank' the last three as '0'
                txtb_material_param2.Text = "0";
                txtb_material_param2.Text = "0";
                txtb_material_param3.Text = "0";
                break;
            case 4:
                OpenTK.Graphics.Color4 paramc = ((OpenTK.Graphics.Color4)paramdata);
                txtb_material_param1.Text = paramc.R.ToString();
                txtb_material_param2.Text = paramc.G.ToString();
                txtb_material_param3.Text = paramc.B.ToString();
                txtb_material_param4.Text = paramc.A.ToString();
                cbx_material_datatype.Text = "Color4";
                break;
            default: //5
                Vector4 paramv = ((Vector4)paramdata);
                txtb_material_param1.Text = paramv.X.ToString();
                txtb_material_param2.Text = paramv.Y.ToString();
                txtb_material_param3.Text = paramv.Z.ToString();
                txtb_material_param4.Text = paramv.W.ToString();
                cbx_material_datatype.Text = "Vector4";
                break;
        }
    }
}
4

2 に答える 2

2

SelectedIndex を設定する前に、まだ 0 でないことを確認する必要があります。

    if (cbx_material_num.SelectedIndex != 0){
       cbx_material_num.SelectedIndex = 0;
    }

そうしないと、毎回イベントを再起動しています。

于 2012-10-26T01:00:19.960 に答える
0

これを設定するたびcbx_material_num.SelectedIndex = 0;に、EventHandlerあなたが呼び出すと思います

cbx_material_numobj_SelectedIndexChanged(object sender, EventArgs e)

呼び出しごとに別の eventHandler が呼び出されるため、しばらくするとスタックがいっぱいになります。基本的に、SelectedIndexChanged と呼ばれるという事実は、値が前の値と異なる必要があることを意味するのではなく、値がセッターによって設定されることを意味します。

于 2012-10-26T00:37:48.597 に答える