私はWindowsフォームアプリケーションで使用する拡張メソッドライブラリを作成しています。私が作成しようとしているメソッドの1つは、入力コントロールのエラー状態をより簡単に設定できるようにすることです。実行時にWindowsフォームでErrorProviderを見つける
public static void SetError(this System.Windows.Forms.TextBox textBox, string errorMessage)
{
if (string.IsNullOrEmpty(errorMessage))
{
//reset control state
textBox.BackColor = System.Drawing.SystemColors.WindowText;
}
else
{
//set background colour to a nice shade of red
textBox.BackColor = System.Drawing.Color.MistyRose;
}
//try to locate an ErrorProvider on the control's containing form.
var errorProvider = LocateErrorProvider(textBox);
if (errorProvider != null)
{
//set error message on error provider (or clear it)
errorProvider.SetError(textBox, errorMessage);
}
}
私はLocateErrorProvider
メソッドを理解しようとしています。私がしたいのは、ErrorProviderが自分のフォーム上に存在するかどうかをチェックし、それが存在する場合にのみそれを使用することです。
ErrorProviderはComponent
ないControl
あるので、私はform.Controls
プロパティを経由して、それを取得することはできません。親フォームをさまざまなオブジェクトにキャストしようとしましたが、無駄です。
UPDATE:私は、次のコード使用してリフレクションを使用してErrorProviderを取得するために管理している。個人的に
private static System.Windows.Forms.ErrorProvider GetErrorProvider(System.Windows.Forms.Control control)
{
//get the containing form of the control
var form = control.GetContainerControl();
//use reflection to get to "components" field
var componentField = form.GetType().GetField("components", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
if (componentField != null)
{
//get the component collection from field
var components = componentField.GetValue(form);
//locate the ErrorProvider within the collection
return (components as System.ComponentModel.IContainer).Components.OfType<System.Windows.Forms.ErrorProvider>().FirstOrDefault();
}
else
{
return null;
}
}
を、私が取得するためにハードコードされたフィールド名を使用してのあまり好きではないんですフィールド。しかし、この場合はうまくいくようです。誰も同じ結果を達成するためのより良い方法を持っていますか?
を 'Dispose'メソッドのデフォルトの実装で使用されている' components'コレクションがあります。私はそれが 'private'か' protected'であるかどうかは思い出せませんが、同じクラスのオブジェクトからアクセスしているので重要ではありません。 –
@Cody Grey:ありがとう、私はそのフィールドに到達しようとしましたが、それは挑戦であることが証明されています。これは暗黙のうちに 'System.Windows.Forms.Form'に結びついたコレクションではなく、Visual StudioによってFormクラスに追加されたデザイン時変数です。私は、そのフィールドに到達するためにリフレクションを試してみましたが、私はErrorProviderを "垣間見る"ことができましたが、まだ実際には "取得"できませんでした。 – tobias86
私はリフレクションを使用してエラープロバイダにアクセスできました。誰かが別の方法を持っている場合は、あなたの答えを投稿してください! – tobias86