0

私は単に解決できない問題を抱えています。何時間も研究してきましたが、結果はありません。助けてください!

私がやろうとしていること:

フォームにクラスをリストするユーザー コントロールがあり、誰かがリストで別の項目を選択した場合にメイン フォームに変更を加えたいと考えています。

だから私はイベントを作成しました:

 private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (listBox1.SelectedIndex != -1)
        {
            Object item = this.List.GetType().GetProperty("Item").GetValue(this.List, new Object[] { listBox1.SelectedIndex });

            Control a = this.TopLevelControl;
            Object temp = a.GetType().GetProperty("currentExpression").GetValue( a, null );

            a.GetType().GetProperty("currentExpression").SetValue(temp, item, null);


        }
    }

このコードでは、「a」がメイン フォームを保持します。(そして、このイベントはユーザー コントロールで実行されます) 必要なものはすべて揃っています。

List オブジェクトは式のリストです。メイン フォームの currentExpression プロパティは Expression です。

プロパティ currentExpression (MainForm の Expression) に Expression ( item と呼びます) を配置したいと考えています。しかし、常に「オブジェクトがターゲット タイプと一致しません」と表示されます。TargetException が処理されませんでした

デバッグすると、両方が正しいことがわかります。( temp と item ) しかし、それでも例外がスローされます。

編集:

「List」オブジェクトは ではなく、List<Something>リストされるオブジェクトであるため、 List はオブジェクト (オブジェクト List ) であると言わざるを得ません。私のユーザー コントロールは一般的です。そのため、リフレクションを使用しています。

このようにして、 objectList1.ShowList(ListExpressions, "OriginalExpression"); を持つことができます。

この場合、ListExpressions はリストですが、オブジェクトとしてユーザー コントロールに送信されます。リフレクションを通じて、それがどのタイプのリストであるかを確認し、プロパティ「OriginalExpression」を読み取ってリストを表示できます。

それで、プロパティ「OriginalExpression」のリストを取得します。

ユーザー コントロールは正常に動作します。問題は、この最後の部分を機能させることです。アイテムをクリックすると、「オブジェクトがターゲット タイプと一致しません。」というメッセージが表示されます。

それを行う方法についてのアイデアはありますか?

どうもありがとう!

4

3 に答える 3

0

このように実装してみませんか:

    private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if ( listBox1.SelectedIndex != -1 )
        {
            var item = this.List.Item[listBox1.SelectedIndex];

            var mainControl = this.TopLevelControl as IExpressionProvider;

            if ( mainControl != null )
                mainControl.CurrentExpression = item;
        }
    }

メインフォームでは、この単純なインターフェースを実装するだけです:

public interface IExpressionProvider
{
    YourExpressionType CurrentExpression { get; set; }
}
于 2013-02-20T22:14:44.527 に答える
0

なぜこれらすべてをリフレクションで行う必要があるのでしょうか。あなたはそれについて何も言わない。

複雑な書き方のように見えます:

var item = this.List[listBox1.SelectedIndex];

var a = this.TopLevelControl;
var temp = a.currentExpression;

temp.currentExpression = item; // ???

ただし、最後の行(私がマークした)は奇妙に???見えGetType()ます. これが私が話しているあなたの質問の行です:acurrentExpressionatempitem

a.GetType().GetProperty("currentExpression").SetValue(temp, item, null);
于 2013-02-20T21:54:09.213 に答える
0

私は問題を解決しました、

それはまさに私が探していたものではありませんが、機能しています!

私は

Control a = this.TopLevelControl;

mainForm a = (mainForm)this.TopLevelControl; 

そしてその

a.GetType().GetProperty("currentExpression").SetValue(temp, (NCalc.Expression)item, null);

a.currentExpression = ( NCalc.Expression )item;

私は反射を避けているので、それは私の問題を解決しました。みんなありがとう!–

于 2013-02-25T16:31:09.517 に答える