0

2つのカスタムリストボックスクラスがあります。

public class MyListBox : ListBox
public class MyCheckedListBox : ListBox

これらは、winformsSystem.Windows.Forms.ListBoxコントロールのラッパーであり、実装やスタイル設定などを少し追加します。

必要に応じて垂直スクロールバーを削除するために、それぞれに次のコードを追加しました。

private const int WS_VSCROLL = 0x00200000;
private bool verticalScrollbar = true;

[DefaultValue(true)]
public bool VerticalScrollbar
{
    get { return this.verticalScrollbar; }
    set
    {
        if (this.verticalScrollbar != value)
        {
            this.verticalScrollbar = value;
            this.RecreateHandle();
        }
    }
}

protected override System.Windows.Forms.CreateParams CreateParams
{
    get
    {
        System.Windows.Forms.CreateParams parms = base.CreateParams;
        if (!this.verticalScrollbar)
            parms.Style &= ~WS_VSCROLL;
        return parms;
    }
}

それぞれを既存のユーザーコントロールに追加しましたがProfileGeneralPanel、期待どおりに機能しました。デフォルトではスクロールバーが表示され、VerticalScrollbarプロパティをfalseに設定すると削除されます。ただし、現在、この配置を複数の場所で使用する必要があるため、この構造を、と呼ばれる別の新しいユーザーコントロールに抽出していますPrivilegesListView。この新しいコントロールには、テーブルに1MyCheckedListBoxつと2つMyListBoxあります。3つすべてがにVerticalScrollbar設定されていfalseます。これまでのところすべて問題ありません。デザイナーはすべてを正しく表示します。

ただし、このコントロールをツールボックスから別のユーザーコントロールにドラッグしようとすると、メソッドが見つからないことを示す例外がスローされます。MyCheckedListBox.set_VerticalScrollbar(Boolean)

問題のメソッドは、明らかにプロパティに対して生成されたメソッドです。私はいつものことをすべて試し、クリーンアップして再構築し、VisualStudioを再起動しました。絶望的な状況から、ビルド時に生成されたILもチェックしました。クラスMyCheckedListBoxには、実際にそのメソッドが定義されています。なぜそれを見つけることができないのか、何か考えはありますか?

コントロール自体のデザイナは毎回正常に開き、別のフォームに追加された場合にのみ問題が発生することに注意してください。

このVerticalScrollbar問題は、がfalseに設定されている場合にのみ発生することに注意してください。これは、デザイナーが生成したコードであるPrivilegesListViewか、コンストラクター自体で手書きされたものです。

注:残念ながら、この段階でDataGridViewは、リストボックスの代わりにのような別のコントロールを使用することはできません...

4

1 に答える 1

3

以前に[アイテムの選択]ダイアログでツールボックスにコントロールを追加した場合、これはうまくいきません。これにより、コントロールアセンブリのコピーが作成され、ツールボックスアイテムアセンブリが保持されているプラ​​イベートディレクトリに保存されます。これがうまくいかないことがわかります。おそらく、フォームに古いバージョンのコントロールを配置しているのですが、メソッドがまだ追加されていません。

このトラップを回避する最善の方法は、作業中のコントロールをVisualStudioにツールボックスに自動的に追加させることです。設定がまだ正しいことを確認してください。VSパフォーマンスを改善しようとする賢明な試みによって変更される傾向があります。[ツールとオプション]、[ウィンドウフォームデザイナ]、[一般]、[AutoToolboxPopulate]をTrueに設定する必要があります。次に、ControlまたはComponentから派生したクラスを持つソリューション内のプロジェクトでは、コンパイル後にそのコントロールがツールボックスの上部に自動的に追加されます。制御コードに加えた変更は、常に同期されます。

一般に、Fuslogvw.exeを使用して、アセンブリ解決の問題のトラブルシューティングを行います。VSでも、独自のプログラムと同じように機能します。すべてのバインディングをログに記録して、成功したものの、間違ったフォルダーからアセンブリのコピーを選択した可能性があるものも表示するようにします。

于 2012-05-01T11:40:22.157 に答える