我正在使用asp.net做一个简单的网站,我在c#后面的代码中通过id查找我的或对象时遇到了麻烦。我有这样的事情:
<asp:ListView ID="InternamentosListView" runat="server"
DataSourceID="InternamentosBD">
<LayoutTemplate>
<table id="camas">
<asp:PlaceHolder runat="server" ID="TablePlaceHolder"></asp:PlaceHolder>
</table>
</LayoutTemplate>
其余部分无关紧要,然后我在后面的代码中使用它:
Table table = (Table)FindControl("camas");
我也试过了:
Table table = (Table)camas;
和
Control table= (Table)FindControl("camas");
这一行中的每一行都给我Null。我做错了什么?
编辑:根据您的回答,我这样做了:<LayoutTemplate>
<table id="camas" runat="server">
</table>
</LayoutTemplate>
并尝试了上述所有事情。同样的结果。
EDIT2:整个代码:
C#
protected void Page_Load(object sender, EventArgs e)
{
Table table = (Table)FindControl("camas");
HiddenField NCamasHF = (HiddenField)FindControl("NCamas");
int NCamas = Convert.ToInt32(NCamasHF);
HiddenField NColunasHF = (HiddenField)FindControl("NColunas");
HiddenField CorMasc = (HiddenField)FindControl("CorMasc");
HiddenField CorFem = (HiddenField)FindControl("CorFem");
int NColunas = Convert.ToInt32(NColunasHF);
TableRow Firstrow = new TableRow();
table.Rows.Add(Firstrow);
for (int i = 1; i <= NCamas; i++)
{
if (i % NColunas == 0)
{
TableRow row = new TableRow();
table.Rows.Add(row);
TableCell cell = new TableCell();
cell.BackColor = System.Drawing.Color.LightGreen;
cell.CssClass = "celula";
row.Cells.Add(cell);
}
else
{
TableCell cell = new TableCell();
cell.BackColor = System.Drawing.Color.LightGreen;
cell.CssClass = "celula";
Firstrow.Cells.Add(cell);
}
}
}
asp.net
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<asp:SqlDataSource
ID="ParametrosBD"
ConnectionString ="<%$ ConnectionStrings:principal %>"
ProviderName = "System.Data.SqlClient"
SelectCommand = "SELECT par_Id, par_NCamas, par_NColunas, par_CorMasculino, par_CorFeminino FROM Parametros WHERE par_Id=1"
runat="server">
</asp:SqlDataSource>
<asp:ListView ID="InternamentosListView" runat="server"
DataSourceID="InternamentosBD">
<LayoutTemplate>
<table id="camas" runat="server">
</table>
</LayoutTemplate>
<ItemTemplate>
<asp:HiddenField ID="NCamas" runat="server" Value='<%# Bind("par_NCamas") %>' />
<asp:HiddenField ID="NColunas" runat="server" Value='<%# Bind("par_NColunas") %>' />
<asp:HiddenField ID="CorMasc" runat="server" Value='<%# Bind("par_CorMasculino") %>' />
<asp:HiddenField ID="CorFem" runat="server" Value='<%# Bind("par_CorFeminino") %>' />
<tr id="cama"></tr>
</ItemTemplate>
</asp:ListView>
</asp:Content>
答案 0 :(得分:3)
正如您已经添加了runat =“server”的步骤1.第二步是按ID查找控件,但您需要递归执行。例如,考虑以下功能:
private Control FindControlRecursive(Control rootControl, string controlID)
{
if (rootControl.ID == controlID) return rootControl;
foreach (Control controlToSearch in rootControl.Controls)
{
Control controlToReturn =
FindControlRecursive(controlToSearch, controlID);
if (controlToReturn != null) return controlToReturn;
}
return null;
}
答案 1 :(得分:3)
要扩展来自MSDN的@Yura Zaletskyy的递归查找控制方法 - 您还可以使用Page本身作为包含控件来开始递归搜索该难以捉摸的表控件(这可能令人抓狂,我知道,我去过那里。)这里有一点方向可能会有所帮助。
using System;
using System.Collections.Specialized;
using System.Web;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI;
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Table table = (Table)FindControlRecursive(Page, "camas");
if (table != null)
{
//Do awesome things.
}
}
private Control FindControlRecursive(Control rootControl, string controlID)
{
if (rootControl.ID == controlID) return rootControl;
foreach (Control controlToSearch in rootControl.Controls)
{
Control controlToReturn = FindControlRecursive(controlToSearch, controlID);
if (controlToReturn != null) return controlToReturn;
}
return null;
}
}
答案 2 :(得分:0)
您需要runat="server"
才能在代码隐藏中看到它。
e.g。
<table id="camas" runat="server">
答案 3 :(得分:0)
确定。您在列表视图模板中拥有该表。您永远不会直接在服务器端找到控件。 您需要做的是在list.Items数组或项目数据绑定事件中查找控件。
看看这个 - how to find control in ItemTemplate of the ListView from code behind of the usercontrol page?
答案 4 :(得分:0)
您需要像之前所述添加runat服务器,但ID将根据ListView行进行更改。你可以添加clientidmode =&#34; Static&#34;如果你只想要1个表并找到使用InternamentosListView.FindControl(&#34; camas&#34;);否则,您将需要添加ItemDataBound事件。
<asp:ListView ID="InternamentosListView" runat="server" DataSourceID="InternamentosBD" OnItemDataBound="InternamentosListView_ItemDataBound">
<LayoutTemplate>
<table id="camas">
<asp:PlaceHolder runat="server" ID="TablePlaceHolder"></asp:PlaceHolder>
</table>
</LayoutTemplate>
您需要在
后面引入代码InternamentosListView_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
Table tdcamas = (Table)e.Item.FindControl("camas");
}
}
答案 5 :(得分:0)
现有答案中没有一个提到明显的内置解决方案FindControl。
Detailed here,FindControl是一个函数,该函数将作为调用Control的子级的控件的id作为字符串,如果存在则返回它,否则返回null。
很棒的事情是,您始终可以从Page控件中调用它,该控件将浏览页面中的所有控件。参见下面的示例。
var myTextboxControl = (TextBox)Page.FindControl("myTextboxControlID);
if (myTextboxControl != null) {
myTextboxControl.Text = "Something";
}
请注意,返回的对象是通用控件,因此,在使用上面的.Text
之类的特定功能之前,您需要对其进行强制转换。
答案 6 :(得分:-1)
当您使用母版页时,此代码应该适合您
请注意,您正在寻找htmlTable,而不是asp:Table
。
//添加名称空间
using System.Web.UI.HtmlControls;
//将占位符的名称更改为您正在使用
的名称HtmlTable tbl = this.Master.FindControl("ContentPlaceHolder1").FindControl("camas") as HtmlTable;
最佳, 尼