例1:ここasp.net:子コントロールのVisibleプロパティはいつ自動的に設定されますか?
<asp:Panel Visible="false" runat="server">
<asp:TextBox ID="textbox" runat="server" />
</asp:Panel>
、textbox.Visible
リターン(TextBox.Visible
が明示的に設定されていなかったにもかかわらず、その目に見えない親からプロパティを「継承」するように見える)のコードでfalse
。
例2:ここ
<asp:DataGrid ID="grid" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:TemplateColumn Visible="False">
<ItemTemplate>
<asp:TextBox ID="textbox" runat="server" />
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
...
</asp:DataGrid>
、((TextBox)grid.Items[0].FindControl("textbox")).Visible
戻りtrue
(データグリッドは、少なくとも一つの列を有しているという仮定の下で)。
質問:がデザインすることで、この矛盾した行動ですか?いずれの場合も、親要素の一部が見えないため、TextBoxはレンダリングされません。
(テキストボックスは、テンプレート内にある第二の場合には、確かに、私はテンプレート定義の抽象テキストボックスを照会しないよ、私は、行番号0の特定の具体的なテキストボックスを照会しています)背景: TextBoxはスマートコントロールです。TextBoxが表示されている場合、HTML <input>
コントロールとしてレンダリングされ、現在のText
値がポストバックに送信されます。ViewState経由で再度送信する必要はありません。もちろん、TextBoxが表示されていない場合はレンダリングされず、したがってText
プロパティの変更は失われます。
ここで、例2は私たちにいくつかの問題を与えています。 textbox
はレンダリングされていると思っています(ILスパイによれば、のプロパティをチェックしているため、ViewStateは使用されず、コードで行われたtextbox.Text
の変更はすべて失われます)。私は今これがバグかどうか疑問に思っています。
関連質問:How to get the set/real value of the Visible property in Asp.Net.
編集:私はこの上のマイクロソフト接続バグレポートを作成しました:
- Webforms: Control.Visible does not recognize that the control is within an invisible DataGrid column
+1、説明のためにありがとうございます。私は答えとして受け入れる前にちょっと待っています。なぜ、これが例2で正しく動作しないのか不思議であるからです。結局、再帰的に表示するコードは '_parent.Visible'を呼び出します。直接の親だけでなく、親ツリーの上に隠されたコントロールがあります。 – Heinzi
@ Heinzi今日の後半の例2を詳しく見てみよう。たぶん、GridViewはそれ自身のVisible実装か何かを持っています。 – rsbarro
@Heinzi 2番目の例でTextBoxがVisibleとして表示されている理由を示すために、私の答えを更新しました。しかし、私が混乱していることの1つは、TemplateColumnが表示されていない場合、TextBoxの値がどのように変化するのでしょうか?グリッドがデータバインドされているときにTextBoxを値に設定していて、それをPostBackに戻すことができないと言っていますか? – rsbarro