ASP.NET trouver de contrôle par id
Je suis en train de faire un site web simple à l'aide de asp.net et je vais avoir des problèmes à trouver mon ou les objets par id dans le code behind en c#. J'ai quelque chose comme ceci:
<asp:ListView ID="InternamentosListView" runat="server"
DataSourceID="InternamentosBD">
<LayoutTemplate>
<table id="camas">
<asp:PlaceHolder runat="server" ID="TablePlaceHolder"></asp:PlaceHolder>
</table>
</LayoutTemplate>
le reste est sans importance, puis-je l'utiliser dans le code-behind:
Table table = (Table)FindControl("camas");
j'ai aussi essayé:
Table table = (Table)camas;
et
Control table= (Table)FindControl("camas");
et chacun de ces lignes me donne la valeur Null. suis-je en train de faire quelque chose de mal ?
EDIT: a Partir de vos réponses j'ai fait ceci:
<LayoutTemplate>
<table id="camas" runat="server">
</table>
</LayoutTemplate>
et essayé tous les points énoncés ci-dessus. même résultat.
EDIT2: Tout le Code:
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>
- j'ai utilisé runat="server" déjà et encore je obtenir de l'null. J'utilise cette fincControl avec les balises ASP trop (Qui s'exécutent dans le serveur) et je reçois null.
- n'ai pas fait cela dans un certain temps, essayez d'ajouter un
name="camas"
avec l'id - le nom n'est pas une propriété valide ici. qui est venu à mon esprit aussi.
Vous devez vous connecter pour publier un commentaire.
Étendre sur @Yura Zaletskyy de la recherche récursive méthode de contrôle de MSDN - vous pouvez également utiliser la Page elle-même comme le contenant de contrôle pour commencer votre recherche récursive de l'insaisissable tableau de contrôle (qui peut être désagréable, je sais, j'ai été là.) Voici un peu plus de sens qui peuvent aider.
Que vous avez déjà ajouté des runat="server" est l'étape 1. La deuxième étape est de trouver de contrôle par l'id, mais vous devez le faire de manière récursive. Par exemple, considérons fonction suivante:
Vous avez besoin d'avoir
runat="server"
pour vous d'être en mesure de le voir dans le code-behind.par exemple
Ok. Vous avez la table dans la liste modèle de vue. Vous ne trouverez jamais le contrôle, directement sur le côté serveur.
Ce que vous devez faire est de trouver de contrôle dans les éléments de la liste.Les éléments de matrice ou à l'intérieur de l'élément lié aux données de l'événement.
Prendre un coup d'oeil à cette comment trouver de contrôle dans ItemTemplate de la liste de code-behind de l'objet usercontrol page?
Vous devez ajouter runat serveur comme indiqué précédemment, mais l'ID change en fonction ListView ligne. Vous pouvez ajouter clientidmode="Statique" à votre table si vous vous attendez à de 1 table et de trouver de l'aide InternamentosListView.FindControl("camas"); sinon, vous devrez ajouter ItemDataBound événement.
Vous aurez besoin d'introduire dans le code derrière
Aucune des réponses mentionnent l'évidente solution intégrée, FindControl.
Détaillé ici, FindControl est une fonction qui prend une chaîne de l'id d'un contrôle qui est un enfant de l'appel de Contrôle, de la retourner si elle existe, ou null si il n'a pas.
Le truc cool, c'est que vous pouvez toujours l'appeler à partir de la Page de contrôle qui va chercher dans tous les champs dans la page. Voir ci-dessous pour un exemple.
Noter que l'objet retourné est un générique de Contrôle, de sorte que vous aurez besoin de la lancer avant de pouvoir utiliser des fonctionnalités spécifiques comme
.Text
ci-dessus.Lorsque vous utilisez une page maître, ce code devrait fonctionner pour vous
Note que vous êtes à la recherche pour htmlTable et pas
asp:Table
.//ajouter l'espace de noms
//changement de nom de la place de titulaire à celui que vous utilisez
Meilleur,
Benny