Web アプリケーションで 2 つのユーザー コントロールを使用しています。別のユーザー コントロールを介して、ユーザー コントロールからラベル テキストを読み取りたいです。どうすれば読めますか?
3 に答える
コードをリファクタリングし、別の UI コントロールのラベルの内容に依存しないようにする必要があります。そのユーザー コントロールで行うのと同じ方法でその値を取得するか、コードの重複を避けるために別のクラスでその機能を抽出し、両方の場所から呼び出します。
ただし、この既存のコードに固執しない場合は、インターフェイスを作成し、外部コードから呼び出さないすべての UserControls 機能をキャプチャする必要があります (この場合は、ラベル テキストを返す)。次に、外部から呼び出す必要があるユーザー コントロールにそのインターフェイスを実装します。その後は、コントロール インスタンスを検索するだけです。すべての Page 子コントロールを列挙することでそれを行うことができます。以下は、コントロールがラベル テキストを返さなければならないことを定義する単純なインターフェイスのコード例と、コントロール ツリーでユーザー コントロールを名前で検索するクラスです。
public interface IUserControl
{
string LabelText();
}
public class PageUserControls
{
private Page parentPage;
public PageUserControls(Page myParentPage)
{
this.parentPage = myParentPage;
}
private IEnumerable<Control> EnumerateControlsRecursive(Control parent)
{
foreach (Control child in parent.Controls)
{
yield return child;
foreach (Control descendant in EnumerateControlsRecursive(child))
yield return descendant;
}
}
public IUserControl GetControl(string controlName)
{
foreach (Control cnt in EnumerateControlsRecursive(this.parentPage))
{
if (cnt is IUserControl && (cnt as UserControl).AppRelativeVirtualPath.Contains(controlName))
return cnt as IUserControl;
}
return null;
}
}
次に、その Label を保持するユーザー コントロールにそのインターフェイスを実装する必要があります。
public partial class WebUserControl1 : System.Web.UI.UserControl, IUserControl
{
public string LabelText()
{
return Label1.Text;
}
}
最後に、別のユーザー コントロールから使用します。
PageUserControls puc = new PageUserControls(this.Page);
string txt1 = puc.GetControl("WebUserControl1.ascx").LabelText();
ところで。メソッド EnumerateControlsRecursive は SO answer からFinding all controls in an ASP.NET Panel? に採用されていますか?
MSDNのこの記事をご覧ください。
つまり、ID を知っていれば、他のコントロールにアクセスできます。
このように使用...
ユーザー コントロールにパブリック プロパティを 1 つ作成し、その値が必要な場所でユーザー コントロール名を使用してそのプロパティを呼び出します。