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
は、リストボックスの代わりにのような別のコントロールを使用することはできません...