2016-06-23 11 views
4

コンテンツページからのマスターページへのアクセスで、コントロール、イメージボタンが正確に見つかりました。マスターページのHTMLコードを以下に示します。そうすることで、私はMasterPage。クラス内の.FindControl

<body> 
    <form id="form1" runat="server"> 
    <div class="navLeft"> 
     <br />   
     <asp:ImageButton ID="imgbtnMooring" runat="server" 
      Height="60px" ImageUrl="~/Item/RibbonIcon/Dashboard.png" /> 
     <br /> 
    </div> 
    <div class="navTop">    
    </div> 
    <div class="banner"> 
     <asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server"> 
     </asp:ContentPlaceHolder> 
    </div> 
    <div class="divider"> 
     <asp:ContentPlaceHolder id="ContentPlaceHolder2" runat="server"> 
     </asp:ContentPlaceHolder> 
    </div> 
    <div class="content"> 
     <asp:ContentPlaceHolder id="ContentPlaceHolder3" runat="server"> 
     </asp:ContentPlaceHolder> 
    </div> 
    </form> 
</body> 

成功私は今、ファイル

string validMooring = ""; 

    comm = new SqlCommand("SELECT * FROM dbo.StructureCurrent", conn); 
    conn.Open(); 
    reader = comm.ExecuteReader(); 
    while (reader.Read()) 
    { 
     validMooring = reader["StructureMooring"].ToString(); 
    } 

    switch (validMooring) 
    { 
     case "YES": 
      (Page.Master.FindControl("imgbtnMooring") as ImageButton).Enabled = true; 
      (Page.Master.FindControl("imgbtnMooring") as ImageButton).ImageUrl = "~/Item/RibbonIcon/Dashboard.png"; 
      break; 
     case "NO": 
      (Page.Master.FindControl("imgbtnMooring") as ImageButton).Enabled = false; 
      (Page.Master.FindControl("imgbtnMooring") as ImageButton).ImageUrl = "~/Item/RibbonIcon - Grey/DashboardGrey.png"; 
      break; 
     default: 
      break; 
    } 

aspx.csコンテンツページに次のコードを入れたとき、私はクラスファイルを作ってみます上記のコードを任意のコンテンツページにアクセスできるようにGeneralClassという名前を付けました。 sqlコマンドは、サーバーからYES/NO値を抽出するだけです。そのため、私の問題に対して無視できるものと考えています。続き

はGeneralClassクラスファイル内のコードです:

MasterPage masterPage = new MasterPage(); 
    masterPage.MasterPageFile = "~/GeneralLayout.master"; 

    string validMooring = ""; 

    comm = new SqlCommand("SELECT * FROM dbo.StructureCurrent", conn); 
    conn.Open(); 
    reader = comm.ExecuteReader(); 
    while (reader.Read()) 
    { 
     validMooring = reader["StructureMooring"].ToString(); 
    } 

    switch (validMooring) 
    { 
     case "YES": 
      (masterPage.FindControl("imgbtnMooring") as ImageButton).Enabled = true; 
      (masterPage.FindControl("imgbtnMooring") as ImageButton).ImageUrl = "~/Item/RibbonIcon/Dashboard.png"; 
      break; 
     case "NO": 
      (masterPage.FindControl("imgbtnMooring") as ImageButton).Enabled = false; 
      (masterPage.FindControl("imgbtnMooring") as ImageButton).ImageUrl = "~/Item/RibbonIcon - Grey/DashboardGrey.png"; 
      break; 
     default: 
      break; 
    } 

何とかライン(のImageButtonとしてmasterPage.FindControl( "imgbtnMooringは"))null値を返します。

誰でもこの問題を解決できますか?

答えて

0

私はマスターページ上のコントロールを見つけることです、私が望むことを行うために離れましたサーバーからのYES/NO値を使用してボタンを有効/無効にします。以下は私が使用するコードです。 1つの画像ボタンのコードを投稿する私の質問とは異なり、わかりやすいように2つの画像ボタンのコードを投稿します。このコードは私の 'GeneralClass'クラスファイル用です

public void validNavLeft() 
{ 
    string validHull = "", validMooring = ""; 

    comm = new SqlCommand("SELECT * FROM dbo.StructureCurrent", conn); 
    conn.Open(); 
    reader = comm.ExecuteReader(); 
    while (reader.Read()) 
    { 
     validHull = reader["StructureHull"].ToString(); 
     validMooring = reader["StructureMooring"].ToString(); 
    } 

    var pageHandler = HttpContext.Current.CurrentHandler; 
    Control ctrlHull = ((Page)pageHandler).Master.FindControl("imgbtnHull"); 
    ImageButton imgBtnHull = (ImageButton)ctrlHull; 
    Control ctrlMooring = ((Page)pageHandler).Master.FindControl("imgbtnMooring"); 
    ImageButton imgBtnMooring = (ImageButton)ctrlMooring; 

    switch (validHull) 
    { 
     case "YES": 
      imgBtnHull.Enabled = true; 
      imgBtnHull.ImageUrl = "~/Item/RibbonIcon/Dashboard.png"; 
      break; 
     case "NO": 
      imgBtnHull.Enabled = false; 
      imgBtnHull.ImageUrl = "~/Item/RibbonIcon - Grey/DashboardGrey.png"; 
      break; 
     default: 
      break; 
    } 
    switch (validMooring) 
    { 
     case "YES": 
      imgBtnMooring.Enabled = true; 
      imgBtnMooring.ImageUrl = "~/Item/RibbonIcon/Dashboard.png"; 
      break; 
     case "NO": 
      imgBtnMooring.Enabled = false; 
      imgBtnMooring.ImageUrl = "~/Item/RibbonIcon - Grey/DashboardGrey.png"; 
      break; 
     default: 
      break; 
    } 
} 
2

あなたのコードがコントロールを見つけることができないと思われるので、ページ拡張メソッドを使用することができます。

Master.cs:

private void Page_Load(object sender, System.EventArgs e) 
{ 
    this.EnableControls(null); 
} 

GeneralClassクラスファイルに次の名前空間を追加します。

using System.Web; 
using System.Web.UI; 
using System.Web.UI.HtmlControls; 
using System.Web.UI.WebControls; 

public static void EnableControls(this Page page, ControlCollection ctrl) 
{ 
    if (ctrl == null) 
     ctrl = page.Controls; 

    string validMooring = ""; 

    comm = new SqlCommand("SELECT * FROM dbo.StructureCurrent", conn); 
    conn.Open(); 
    reader = comm.ExecuteReader(); 
    while (reader.Read()) 
    { 
     validMooring = reader["StructureMooring"].ToString(); 
    } 

    foreach (Control item in ctrl) 
    { 
     if (item.Controls.Count > 0) 
      EnableControls(page, item.Controls, isEnable); 

     if (item.GetType() == typeof(ImageButton)) 
     { 
      switch (validMooring) 
      { 
       case "YES": 
       ((ImageButton)item).Enabled = true; 
       ((ImageButton)item).ImageUrl = "~/Item/RibbonIcon/Dashboard.png"; 
       break; 

       case "NO": 
       ((ImageButton)item).Enabled = false; 
       ((ImageButton)item).ImageUrl = "~/Item/RibbonIcon - Grey/DashboardGrey.png"; 
       break; 
      default: 
       break; 
     } 

    } 
} 
+0

これはマルチプル画像ボタン用ですか? – Fahmieyz

+0

はいこれはページ内のすべてのコントロールで機能します。 –

+0

私は、このイメージが複数のイメージボタンにあることを意味します。このイメージボタンには、この場合はvalidMooringのような独自の検証があります。あなたのコードから理解できるものから、複数の画像ボタンにしか使用できますが、1つの検証があります。 – Fahmieyz