我有一个名为DateTimeUC的用户控件,它的标记上有两个文本框:
<asp:TextBox ID="dateTextBox" runat="server"></asp:TextBox>
<asp:TextBox ID="timeTextBox" runat="server"></asp:TextBox>
Run Code Online (Sandbox Code Playgroud)
我在另一个用户控件中动态创建此控件:
Controls.Add(GenerateDateTime(parameter));
private DateTimeUC GenerateDateTime(SomeParameter parameter)
{
DateTimeUC uc = new DateTimeUC();
uc.ID = parameter.Name;
return uc;
}
Run Code Online (Sandbox Code Playgroud)
但是当我渲染页面时,DateTimeUC什么也没渲染.我这样检查过:
protected override void Render(HtmlTextWriter writer)
{
base.Render(writer);
StringBuilder builder = new StringBuilder();
StringWriter swriter = new StringWriter(builder);
HtmlTextWriter hwriter = new HtmlTextWriter(swriter);
base.Render(hwriter);
string s = builder.ToString();
}
Run Code Online (Sandbox Code Playgroud)
s为空,Controls.Count为0.我做错了什么?
任何人都知道如何动态加载共享/静态函数内的控件?函数本身位于mustinherit/abstract类中.(这是VB中的ASP.NET项目)我想做这样的事情:
VB:
Public Shared Function GetWidget(ByVal name As WidgetName) As Control
Select Case name
Case WidgetName.Name1
Return LoadControl("~/Control1.ascx")
Case WidgetName.Name2
Return LoadControl("~/Control2.ascx")
Case WidgetName.Name3
Return LoadControl("~/Control3.ascx")
End Select
End Function
Run Code Online (Sandbox Code Playgroud)
我的C#有点生疏,所以这可能有一些语法错误:
Public Static Control GetWidget(WidgetName name)
{
switch (name)
{
Case WidgetName.Name1:
return LoadControl("~/Control1.ascx");
break;
Case WidgetName.Name2:
return LoadControl("~/Control2.ascx");
break;
Case WidgetName.Name3:
return LoadControl("~/Control3.ascx");
break;
}
}
Run Code Online (Sandbox Code Playgroud)
(WidgetName是一个枚举器.)
我得到"无法在没有类的显式实例的情况下从共享方法或共享成员初始化程序中引用类的实例成员.",但我不明白这个错误.我明白它意味着什么,我只是不明白为什么编译器看不到调用LoadControl是一个显式的类实例.使用LoadControl从文件创建新控件有什么不明确的?我尝试创建一个新的用户控件并初始化它,然后使用LoadControl将其设置为不同的控件无济于事.我也不想做DirectCast,因为我试图将它放在一个共享的,必须(抽象)的类中,因此没有.aspx文件写入<%@ Reference Control="~/SomeControlPath.ascx" %>,所以类名不可用.
我要做的是编写一个静态函数,它接受一些值,并仅根据该控件的源文件位置返回一个控件.最终结果是用户可修改的控件列表.他们获得了一列控件,他们可以根据我指定的可用子控件的静态列表自由添加,删除或重新排序.我没有和这种方法结婚; 它可能在很多方面都是错误的.
是的,我知道那里的静态字符串有代码味道,它实际上看起来并不像那样; 为了提出这个问题,这是一个简化.
欢迎使用C#,VB或简单的英文解释.
到目前为止,我已经尝试了在网上和网上其他地方找到的一些不同的解决方案.也许你们其中一个知识渊博的人可能会帮助...
我有一堆由用户动态创建的控件,我将其作为控件集合存储在会话状态中,因此我可以在每次回发时显示它们.
用户生成的每个控件都是一个div,其中包含其他控件.
我在每个控件上都有一个按钮,允许用户删除控件或复制它.
当用户点击"Duplicate"时,我正在调用处理事件的web方法.
当我的web方法找到要复制的控件时,我想制作该控件的副本并将其添加到页面中(另一个函数处理将其保存到控件集合中(在page_Unload上)
Dim DupCtrl As Control = Nothing
Dim int As Integer = myDynControls.Count
For i = 0 To int - 1
If myDynControls(i).ID.Contains(ctrlID) Then
DupCtrl = Clone_Control(myDynControls(i))
Exit For
End If
Next
End Function
Run Code Online (Sandbox Code Playgroud)
而Clone_Control函数:
Public Shared Function Clone_Control(OriginalControl As Object) As Object
Dim type As Type = OriginalControl.[GetType]()
Dim properties As Reflection.PropertyInfo() = type.GetProperties()
Dim retObject As [Object] = type.InvokeMember("", System.Reflection.BindingFlags.CreateInstance, Nothing, OriginalControl, Nothing)
For Each propertyInfo As Reflection.PropertyInfo In properties
If propertyInfo.CanWrite Then …Run Code Online (Sandbox Code Playgroud) 我有大约10个下拉列表控件被填充.我想以编程方式创建它们,而不是复制/粘贴和修改每个字段.可以这样做吗?
这是他们中的一个.我想以编程方式添加10个下拉列表控件及其各自的SqlDataSource控件.
<asp:SqlDataSource ID = "ddlDAGender" runat=server
ConnectionString="<%$ ConnectionStrings:test1ConnectionString %>"
SelectCommand = "select GenderID,Gender from mylookupGender"
>
</asp:SqlDataSource>
<asp:Label ID="Label3" runat="server" Text="Gender"></asp:Label>
<asp:DropDownList ID="ddlGender" runat="server"
DataSourceid="ddlDAGender"
DataTextField="Gender" DataValueField="GenderID"
>
</asp:DropDownList>
Run Code Online (Sandbox Code Playgroud) 我正在创建一个ASP.NET应用程序,在该应用程序中,程序管理员将能够为用户将填写并提交的表单定义自定义字段.
管理员需要定义各种类型的字段,如复选框,单选按钮,文本框和textareas,供用户填写.管理员还可以定义是否需要这些自定义字段.
我现在处于规划阶段,我想知道如何将这些自定义字段定义存储在数据库中以及如何将它们渲染出来并使它们起作用.
最终用户使用这些动态创建的表单字段提交的表单数据也必须保留在数据库中.
我该如何解决这个问题?
在父控件中查找控件的FramworkElement.FindName()方法似乎应该直截了当...
但我正在加强anty,似乎框架不喜欢我想做的事情.
首先,我意识到有很多不同的做事方式,请记住这是我在WPF中创建的第一种形式.
我根据集合中的项目数将控件加载到StackPanel中.此方法是必须的,因为集合由[用户输入的URL]中的目录数决定.
该列表将水平堆栈面板构建为垂直堆栈面板,该面板在设计期间放置在表单上.
所以dirStackPanel就在表格上.我将controlStackPanel插入dirStackPanel n次,并用识别名称命名每个:(string)("controlStackPanel"+ n).
我也在使用控件填充controlStackPanel,但考虑到我无法通过名称从父级(dirStackPanel)检索controlstackPanel,这是一个没有实际意义的问题.
例:
var getPanel = (StackPanel) this.dirStackPanel.FindName((string)("controlStackPanel" + n))返回Null
所以要清楚的是,我在AT RUN TIME插入的每个控件都被分配了一个名称,并且可以使用循环轻松检索.但FindName方法不适用于父"StackPanel"的第一个子控件.它不断返回null而不是对象.
有任何想法吗?
我想在某些条件下在GridView单元格上添加一个按钮.我在RowDatabound事件中执行了以下操作
if( i==0)
{
Button btn= new Button();
btn.Text = "view more";
e.Row.Cells[7].Controls.Add(btn);
}
Run Code Online (Sandbox Code Playgroud)
执行此操作时,绑定的单元格中的文本将丢失,并且仅显示按钮.我需要有按钮以及已经存在的单元格文本.
有人可以帮我这样做吗?提前致谢
我在C#winforms项目中工作,我有一个用户控件,从工具条菜单中选择加载它.我有一个字典查找设置在用户控件的表单加载时发生,用于其他功能.此外,当我关闭用户控件时,我只是使用".Hide();" 方法.我注意到当我第一次加载用户控件时一切都很好,但是当我关闭它并选择再次打开它时,它第二次创建了一个新的对象实例,从而抛弃了我的字典查找.因此,我写了一些代码来试图解决这个问题.
我需要做的是以某种方式说如果用户控件的实例已经存在,则不要创建该对象的新实例.相反,只需再次使用户控件可见.因此,我编写了代码以试图实现此目的.当我第一次选择项目时,一切都很好.当我隐藏用户控件并尝试再次重新打开它时,没有任何反应.
以下是我为此目的编写的代码,它是在从工具条菜单中选择项目时发生的:
if (Controls.ContainsKey("CheckAvailUserControl"))
{
Controls["CheckAvailUserControl"].Dock = DockStyle.Fill;
Controls["CheckAvailUserControl"].Visible = true;
Controls["CheckAvailUserControl"].Show();
Controls["CheckAvailUserControl"].Refresh();
}
else
{
UserControl checkAvailUserControlLoad = new CheckAvailUserControl();
Controls.Add(checkAvailUserControlLoad);
checkAvailUserControlLoad.Dock = DockStyle.Fill;
checkAvailUserControlLoad.Visible = true;
checkAvailUserControlLoad.Show();
}
Run Code Online (Sandbox Code Playgroud)
当我在调试器中跟踪我的代码时,它实际上是在上面的if/else语句的正确部分.它只是在我第二次尝试加载它时才在屏幕上显示用户控件.
问题是:关闭后如何让用户控件正确加载,然后再从工具条菜单中选择它?
这是我的问题......
我有一个页面,最初呈现并显示使用Ajax.BeginForm创建的AJAX表单.输入一些标准并发布AJAX表单.返回部分视图,其中包含使用Html.BeginForm创建的HTML表单.
到目前为止一切都那么好......到目前为止一切都运行良好.我不引人注目的客户端验证对从局部视图创建的元素非常有用.当我现在尝试创建一些动态输入元素(通过jQuery)并将它们插入/附加到由局部视图创建的表单时,我的问题就出现了.我无法在动态创建的元素上进行任何不显眼的客户端验证.
我尝试过: - 克隆现有元素,修改它们的ID /名称并将它们附加到DOM中. - 创建html字符串并将其插入DOM中.
每次插入动态元素后,我都尝试调用: - $ .validator.unobtrusive.parseElement()[new element] - $ .validator.unobtrusive.parse()[new container,document,etc] - $ .validator.unobtrusive .parseDynamicContent()[插件]
这是jQuery代码的详细信息......
$("#insert").live("click", function () {
var html = "<input type='text' value='' name='CustomerNominationVolume' id='CustomerNominationVolume' data-val-required='The Nomination (Dth) field is required.' data-val-number='The field Nomination (Dth) must be a number.' data-val='true' /><br />"
html += "<span class='field-validation-valid' data-valmsg-replace='true' data-valmsg-for='CustomerNominationVolume'></span>";
$("#new").html(html);
});
$("#parse").live("click", function () {
$.validator.unobtrusive.parse(document);
});
$("#validate").live("click", function () {
var element = $("#CustomerNominationVolume");
var form = $(element).first().closest('form');
form.validate().element(element);
}); …Run Code Online (Sandbox Code Playgroud) 是否可以将TDateTimePicker的字体设置为斜体?我在这段代码中这样做
var
DatEdit : TDateTimePicker;
begin
//I know Canvas is a stupid name for TPanel
DatEdit:=TDateTimePicker.Create(Canvas);
DatEdit.OnEnter := CtrlInputProc;
DatEdit.OnExit := CtrlExitProc;
DatEdit.Enabled := false;
DatEdit.Font.Style := DatEdit.Font.Style + [fsItalic]; //this line creates an exception
DatEdit.Parent := Canvas;
end;
Run Code Online (Sandbox Code Playgroud)
每次代码执行最后一行时,都会抛出一个带有消息的EInvalidOperation异常:
„Control” has no parent window.
Run Code Online (Sandbox Code Playgroud)
这是Delphi 5的功能,还是我做错了什么?
在我的ASP.NET页面的代码背后,我正在创建一个复选框:
CheckBox cb = new CheckBox();
Run Code Online (Sandbox Code Playgroud)
但我希望新复选框调用客户端函数而不是回发.我希望能够做到这样的事情:
cb.OnClientClick = "Javascript:MyClientFunction();";
Run Code Online (Sandbox Code Playgroud)
但那不存在.我该如何在飞行中连接它呢?