GVKun编程网logo

如何访问动态添加的UserControl(动态访问权限)

25

在本文中,我们将详细介绍如何访问动态添加的UserControl的各个方面,并为您提供关于动态访问权限的相关解答,同时,我们也将为您带来关于.net–Masterpage与Usercontrol与Cu

在本文中,我们将详细介绍如何访问动态添加的UserControl的各个方面,并为您提供关于动态访问权限的相关解答,同时,我们也将为您带来关于.net – Masterpage与Usercontrol与Customcontrol之间的区别、android – 在framelayout中访问动态添加的谷歌地图片段、AngularJS:动态添加的字段未在FormController上注册、Asp.net UserControl LoadControl问题的有用知识。

本文目录一览:

如何访问动态添加的UserControl(动态访问权限)

如何访问动态添加的UserControl(动态访问权限)

ContentControl中的MainWindowx:Name

<ContentControl x:Name="cc" Content="{StaticResource Template1}"/>

...并尝试投射属性:

var theTemplate = cc.Content as ContentControl;
var theUserControl = theTemplate?.Content as UserControl;
var theDataContext = theUserControl?.DataContext;

.net – Masterpage与Usercontrol与Customcontrol之间的区别

.net – Masterpage与Usercontrol与Customcontrol之间的区别

请帮助我理解Master页面与Usercontrol与Custom控件之间的区别

解决方法

在这里检查类似问题的答案:

ASP.Net Custom controls vs. user controls: Are these two the same

母版页实际上是用户控件;您可以通过转到主页类的代码隐藏来验证这一点,右键单击类名并选择“转到定义”.你会看到这样的东西:

public class MasterPage : UserControl
{
    ...
}

用户控件便于显示使用单个项目重复的显示组件,例如菜单和面板.问题是,如果需要,它们不会生成.DLL并且必须手动复制到其他项目.

另一方面,自定义控件可以在单独的类库中创建,并根据需要在其他项目中重用.使用自定义控件时,必须完全在代码中创建显示工件,并且开发需要稍长的时间.

查看Microsoft的用户控件和自定义控件之间的比较:

http://support.microsoft.com/kb/893667

android – 在framelayout中访问动态添加的谷歌地图片段

android – 在framelayout中访问动态添加的谷歌地图片段

我在framelayout中动态添加了我的谷歌地图片段.现在我想把标记和谷歌地图做其他的东西.但我无法通过get片段管理器访问它.代码显示没有错误但是当它执行时它返回空指针异常.

我认为它的逻辑错误.与类型铸造有关.请帮助

这是我的“nearby_places.xml”布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/map_area"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <com.localiteproximus.CustomAutoCompleteTextView
    android:id="@+id/atv_places"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"        
    android:layout_alignParentTop="true"
    android:hint="@string/str_atv_places"
    android:singleLine="true" />

    <FrameLayout
    android:id="@+id/mapView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"android:layout_below="@id/atv_places">

</FrameLayout>
</RelativeLayout>

这是我的班级

public class NearByPlaceFragment extends Fragment {

public NearByPlaceFragment(){}

View rootView;
GoogleMap googleMap;

public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {

        MapFragment fragment = new MapFragment();
        FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
        transaction.add(R.id.mapView,fragment).commit();
 rootView = inflater.inflate(R.layout.nearby_places,container,false);

  googleMap = ((MapFragment) getFragmentManager().findFragmentById(
                    R.id.map)).getMap();
 return rootView

}

和LogCat显示这一点

58.608: E/AndroidRuntime(12654): FATAL EXCEPTION: main
03-22 03:00:58.608: E/AndroidRuntime(12654): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.localiteproximus/com.localiteproximus.NearbyPlaces}: android.view.InflateException: Binary XML file line #21: Class is not a View com.google.android.gms.maps.MapFragment
03-22 03:00:58.608: E/AndroidRuntime(12654):    at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:2294)
03-22 03:00:58.608: E/AndroidRuntime(12654): Caused by: java.lang.classCastException: com.google.android.gms.maps.MapFragment cannot be cast to android.view.View
03-22 03:00:58.608: E/AndroidRuntime(12654):    at java.lang.class.asSubclass(Class.java:1182)
03-22 03:00:58.608: E/AndroidRuntime(12654):    at android.view.LayoutInflater.createView(LayoutInflater.java:565)
03-22 03:00:58.608: E/AndroidRuntime(12654):    ... 23 more

解决方法

我自己得到了答案.

所以这真是一个愚蠢的错误.6小时后我发现错误就在这条线上

googleMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.mapView)).getMap();

它正在获取其父视图而不是子视图,因此将其替换为此行

googleMap = ((MapFragment) getChildFragmentManager().findFragmentById(R.id.mapView)).getMap();

一切都很好:).

AngularJS:动态添加的字段未在FormController上注册

AngularJS:动态添加的字段未在FormController上注册

我在AngularJS中具有以下 静态 形式:

<form name="myForm">  <label>First Name:</label>  <input type="text" name="first_name" ng-model="entity.first_name">  <label>Last Name:</label>  <input type="text" name="last_name" ng-model="entity.last_name"></form>

Angular为我创建了一个FormController并将其发布到范围内(在表单名称下)。这意味着我可以访问以下属性:

$scope.myForm.first_name.$error$scope.myForm.last_name.$invalid...

这超级有用!

但就我而言,我正在使用指令 动态 构建表单:

<form name="myForm">  <field which="first_name"></field>  <field which="last_name"></field></form>

<field>指令不解决实际<input>元素,直到一段时间后(我已经从服务器获得的一些数据,链接的指令等)。

这里的问题是在表单控制器上没有定义任何字段属性,就像动态字段未向FormController注册一样:

// The following properties are UNDEFINED (but $scope.myForm exists)$scope.myForm.first_name$scope.myForm.last_name

知道为什么吗?任何解决方案/解决方法?

您可以在此jsFiddle中查看整个代码:http :
//jsfiddle.net/vincedo/3wcYV/

答案1

小编典典

2015年7月31日更新
自1.3起已修复,请参见此处:https
:
//github.com/angular/angular.js/issues/1404#issuecomment-125805732

原始答案
不幸的是,目前这是AngularJS的不足。Angular的表单验证不适用于动态命名的字段。您可以在HTML的底部添加以下内容,以查看发生了什么事:

<pre>{{myForm|json}}</pre>

如您所见,Angular没有正确输入动态输入名称。当前有一种涉及嵌套表单的工作,这种嵌套表单可能有点讨厌,但是它确实可以工作,并且(只需做一些额外的工作)就可以毫无困难地提交父表单。

如果需要,您可以为该问题提供更多支持:GitHub Issue-
动态元素验证。无论哪种方式,下面都是代码:

http://jsfiddle.net/langdonx/6H8Xx/2/

HTML:

<div data-ng-app>    <div data-ng-controller="MyController">        <form id="my_form" name="my_form" action="/echo/jsonp/" method="get">            <div data-ng-repeat="field in form.data.fields">                <ng-form name="form">                    <label for="{{ field.name }}">{{ field.label }}:</label>                    <input type="text" id="{{ field.name }}" name="{{field.name}}" data-ng-model="field.data" required>                    <divdata-ng-show="form[''\{\{field.name\}\}''].$error.required">Can''t be empty.</div>                </ng-form>            </div>            <input type="submit" />        </form>    </div></div>

JavaScript:

MyController.$inject = ["$scope"];function MyController($scope) {    $scope.form = {};    $scope.form.data = {};    $scope.form.data.fields = []    var f1 = {        "name": "input_1",        "label": "My Label 1",        "data": ""    };    var f2 = {        "name": "input_2",        "label": "My Label 2",        "data": ""    };    $scope.form.data.fields.push(f1);    $scope.form.data.fields.push(f2);}

Asp.net UserControl LoadControl问题

Asp.net UserControl LoadControl问题

使用LoadControl(type,Params)时,我遇到了一个问题.让我解释…

我有一个超简单的用户控制(ascx)

<%@ Control Language="C#" AutoEventWireup="True" Inherits="Errordisplay" Codebehind="Errordisplay.ascx.cs" EnableViewState="false" %>

<asp:Label runat="server" ID="lblTitle" />
<asp:Label runat="server" ID="lblDescription" />

与代码(c#)后面:

public partial class Errordisplay : System.Web.UI.UserControl
{

    private Message _ErrorMessage;    

    public Errordisplay()
    {
    }

    public Errordisplay(Message ErrorMessage)
    {
        _ErrorMessage = ErrorMessage;
    }    

    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);

        if (_ErrorMessage != null)
        {
            lblTitle.Text = _ErrorMessage.Message;
            lblDescription.Text = _ErrorMessage.Description;
        }
    }
}

在我的Web应用程序的其他地方,我将使用以下代码向用户控件添加一个实例:

divValidationIssues.Controls.Add(LoadControl(typeof(Errordisplay),new object[] { MessageDetails }));

我正在使用LoadControl的重载版本,因为我想将Message参数传递给构造函数.所有这一切似乎都可以正常工作.

但是,当在Errordisplay用户控件上触发OnPreRender()时,lblTitle和lblDescription变量都为空,尽管它们具有等价的标记.消息变量已正确填充.

任何人都可以说明为什么会发生这种情况吗?

谢谢

编辑:

为了清楚起见,我还会补充说,正在编程地将用户控件添加到页面的代码正在响应按钮按钮,所以“主机页面”已经通过Init,Page_Load进行,现在正在处理事件处理程序.

我们无法在早期的asp生命周期阶段添加用户控件,因为它们是响应于按钮单击事件而创建的.

解决方法

我也尝试了以下代码 – 它产生相同的结果(即lblTitle和lblDescription都为null)
protected void Page_Load(object sender,EventArgs e)
{
    if (_ErrorMessage != null)
    {
        lblTitle.Text = _ErrorMessage.Message;
        lblDescription.Text = _ErrorMessage.Description;
    }
}

我了解到,LoadControl函数将控件加载到正在包含的页面的当前“状态”中.因此,Init,Page_Load等都作为LoadControl调用的一部分运行.

有趣的是,这个(未回答)asp.net论坛的帖子展现了与我遇到的相同的问题.

MSDN Forums Post

另外 – 从MSDN:

When you load a control into a container control,the container raises all of the added control’s events until it has caught up to the current event. However,the added control does not catch up with postback data processing. For an added control to participate in postback data processing,including validation,the control must be added in the Init event rather than in the Load event.

所以不要LoadControl正确的控制?

编辑:

好的,所以我在这里回答我自己的问题

我找到一个回复​​版本的论坛帖子,我链接到Here上面

基本上,答案是LoadControl(type,params)不能推断“页面前端”ascx来解析,因此它不会打扰任何控件.当您使用LoadControl(“ascx路径”)版本时,它被赋予页面前端,因此执行所有解析和初始化.

总而言之,我需要更改正在控制的代码,并将其拆分成单独的部分.即

Control ErrorCntrl = LoadControl("Errordisplay.ascx");
ErrorCntrl.ID = SomeID;
(ErrorCntrl as Errordisplay).SetErrorMessage = MessageDetail;
diverrorContainer.Controls.Add(ErrorCntrl);

它应该工作正常..它不像我以前的尝试一样整洁,但至少它会工作.

我仍然乐意提出上述建议.

干杯

我们今天的关于如何访问动态添加的UserControl动态访问权限的分享已经告一段落,感谢您的关注,如果您想了解更多关于.net – Masterpage与Usercontrol与Customcontrol之间的区别、android – 在framelayout中访问动态添加的谷歌地图片段、AngularJS:动态添加的字段未在FormController上注册、Asp.net UserControl LoadControl问题的相关信息,请在本站查询。

本文标签: