FindControl à l'intérieur de RadGrid (Gridview) Modifier et Insérer des points de vue
J'ai un RadGrid (Gridview) qui a la possibilité de modifier et d'insérer de nouveaux éléments.
Au sein de ces deux options que j'ai un customvalidator pour vérifier les valeurs existantes afin de les doublons ne peuvent pas être saisis. Ce que je suis coincé à l'est de la capacité à utiliser findcontrol pour la zone de texte seulement est montré pendant la modification et INSERTION.
Cela fonctionne très bien pour les INSÉRER, comme je les appelle GetInsertItem(), mais qui renvoie une erreur lors de la modification et je suis bloqué sur cette. Je veux faire cela en dehors du lié aux données de commande et de méthodes.
protected void cvAccountNumber_ServerValidate(object source, ServerValidateEventArgs args)
{
TextBox txtAccountNumber = (TextBox)RadGrid1.MasterTableView.GetInsertItem().FindControl("txtAccountNumber");
List<GridDataItem> Items = (from item in RadGrid1.Items.Cast<GridDataItem>()
where item["AccountNumberView"].Text == txtAccountNumber.Text
select item).ToList();
args.IsValid = Items.Count() == 0;
}
Voici une image de l'écran de modification.
ASPX:
Sort By Status: <asp:DropDownList ID="dd_Status" runat="server" Width="150px"
onselectedindexchanged="dd_Status_SelectedIndexChanged"
AutoPostBack="True">
<asp:ListItem Text="All" Value="0" Selected="True"></asp:ListItem>
<asp:ListItem Text="Active" Value="True"></asp:ListItem>
<asp:ListItem Text="Inactive" Value="False"></asp:ListItem>
</asp:DropDownList>
<br /><br />
<telerik:RadGrid ID="RadGrid1" runat="server" Skin="Vista" Width="500px"
GridLines="None" AllowFilteringByColumn="False" AllowSorting="True" OnExportCellFormatting="RadGrid1_ExportCellFormatting" DataSourceID="SqlDataSource1"
AllowAutomaticDeletes="true" AllowAutomaticUpdates="True" AutoGenerateEditColumn="True" AutoGenerateDeleteColumn="true" OnItemCommand="RadGrid1_ItemCommand" >
<MasterTableView AutoGenerateColumns="False" DataKeyNames="ID" DataSourceID="SqlDataSource1" ItemStyle-HorizontalAlign="Left" CommandItemDisplay="TopAndBottom">
<Columns>
<telerik:GridTemplateColumn HeaderText="ID" SortExpression="ID" UniqueName="ID" Visible="false" ReadOnly="true">
<ItemTemplate>
<asp:Label ID="lblIDView" runat="server" Text='<%# Bind("ID") %>'></asp:Label>
</ItemTemplate>
</telerik:GridTemplateColumn>
<telerik:GridTemplateColumn HeaderText="ID" SortExpression="IDEdit" UniqueName="IDEdit" Visible="false">
<ItemTemplate />
<EditItemTemplate>
<asp:Label ID="lblID" runat="server" Text='<%# Bind("ID") %>'></asp:Label>
</EditItemTemplate>
</telerik:GridTemplateColumn>
<telerik:GridBoundColumn DataField="AccountNumber" HeaderText="Sapphire Account Number"
SortExpression="AccountNumber" UniqueName="AccountNumberView" ReadOnly="true" ItemStyle-Width="400">
</telerik:GridBoundColumn>
<telerik:GridTemplateColumn HeaderText="Sapphire Account Number" SortExpression="AccountNumber" UniqueName="AccountNumber" Visible="false">
<ItemTemplate />
<EditItemTemplate>
<asp:Textbox ID="txtAccountNumber" runat="server" Text='<%# Bind("AccountNumber") %>' />
<asp:RequiredFieldValidator ID="rfvAccountNumber" ControlToValidate="txtAccountNumber"
ErrorMessage="Sapphire Account Number is required" runat="server" ForeColor="Red"></asp:RequiredFieldValidator>
<asp:CustomValidator ID="cvAccountNumber" runat="server" ErrorMessage="Sapphire Account Number already exists"
ControlToValidate="txtAccountNumber" ForeColor="Red" OnServerValidate="cvAccountNumber_ServerValidate"></asp:CustomValidator>
</EditItemTemplate>
</telerik:GridTemplateColumn>
<telerik:GridTemplateColumn HeaderText="Active" SortExpression="Active" UniqueName="Active" ItemStyle-Width="100" Visible="false">
<ItemTemplate />
<EditItemTemplate>
<asp:CheckBox ID="cbActive" runat="server" Checked='<%# GenerateBindString(Container.DataItem) %>' />
</EditItemTemplate>
</telerik:GridTemplateColumn>
<telerik:GridTemplateColumn HeaderText="Status" SortExpression="Active" UniqueName="Active" ItemStyle-Width="100">
<ItemTemplate>
<asp:Label ID="lblActive" runat="server" Text='<%# Convert.ToBoolean(GenerateBindString(Container.DataItem)) == true ? "Active" : "Inactive" %>'></asp:Label>
</ItemTemplate>
</telerik:GridTemplateColumn>
</Columns>
</MasterTableView>
<ValidationSettings CommandsToValidate="PerformInsert,Update" />
<ClientSettings>
<Selecting AllowRowSelect="True" />
</ClientSettings>
</telerik:RadGrid>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:LBCust %>"
SelectCommand="SELECT * FROM [LBX_Portal_AccountNumbers] WHERE ([Site] = @Site) AND (Active=@Active OR @Active = '0') ORDER BY AccountNumber"
DeleteCommand="DELETE FROM [LBX_Portal_AccountNumbers] WHERE [ID] = @ID"
InsertCommand="INSERT INTO [LBX_Portal_AccountNumbers] ([AccountNumber], [Site], [Active]) VALUES (@AccountNumber, @Site, @Active)"
UpdateCommand="UPDATE [LBX_Portal_AccountNumbers] SET [AccountNumber] = @AccountNumber, [Active] = @Active WHERE [ID] = @ID">
<SelectParameters>
<asp:ControlParameter ControlID="dd_Status" Name="Active"
PropertyName="SelectedValue" Type="String" />
</SelectParameters>
<DeleteParameters>
<asp:Parameter Name="ID" Type="Int32" />
</DeleteParameters>
<InsertParameters>
<asp:Parameter Name="AccountNumber" Type="String" />
<asp:Parameter Name="Site" Type="String" />
<asp:Parameter Name="Active" Type="Boolean" />
</InsertParameters>
<UpdateParameters>
<asp:Parameter Name="AccountNumber" Type="String" />
<asp:Parameter Name="Active" Type="Boolean" />
</UpdateParameters>
</asp:SqlDataSource>
CS:
public partial class Admin_CustomerAccountManager : System.Web.UI.Page
{
public string SiteName = WebConfigurationManager.AppSettings["Site"].ToString();
protected void Page_Load(object sender, EventArgs e)
{
Label LBXTitle = (Label)Master.FindControl("lbxTitle");
LBXTitle.Text = "Customer Sapphire Account Number Manager";
if (!this.IsPostBack)
{
SqlDataSource1.SelectParameters.Add("Site", DbType.String, SiteName);
}
}
protected void dd_Status_SelectedIndexChanged(object sender, EventArgs e)
{
RadGrid1.DataBind();
}
protected bool GenerateBindString(object dataItem)
{
bool ret = false;
//if column is null set checkbox.checked = false
if ((DataBinder.Eval(dataItem, "Active")).ToString() == "")
ret = false;
else //set checkbox.checked to boolean value in Status column
ret = (bool)DataBinder.Eval(dataItem, "Active");
return ret;
}
protected void RadGrid1_ItemCommand(object source, Telerik.Web.UI.GridCommandEventArgs e)
{
Page.Validate();
if (Page.IsValid)
{
if (e.CommandName == "PerformInsert")
{
GridEditFormItem gridEditFormItem = (GridEditFormItem)e.Item;
Label lblID = (Label)gridEditFormItem.FindControl("lblID");
TextBox txtAccountNumber = (TextBox)gridEditFormItem.FindControl("txtAccountNumber");
CheckBox cbActive = (CheckBox)gridEditFormItem.FindControl("cbActive");
bool isActive = true;
string SqlStr = "INSERT INTO [LBX_Portal_AccountNumbers] ([AccountNumber], [Site], [Active])";
SqlStr += " VALUES ('" + txtAccountNumber.Text + "'" + ", '" + SiteName + "'" + ", '" + isActive + "')";
SqlDataSource1.InsertCommand = SqlStr;
SqlDataSource1.Insert();
}
if (e.CommandName == "Update")
{
GridEditFormItem gridEditFormItem = (GridEditFormItem)e.Item;
Label lblID = (Label)gridEditFormItem.FindControl("lblID");
TextBox txtAccountNumber = (TextBox)gridEditFormItem.FindControl("txtAccountNumber");
CheckBox cbActive = (CheckBox)gridEditFormItem.FindControl("cbActive");
bool isActive = false;
if (cbActive.Checked)
isActive = true;
else
isActive = false;
string SqlStr = "UPDATE [LBX_Portal_AccountNumbers] SET [AccountNumber] = '" + txtAccountNumber.Text;
SqlStr += "', [Active] = '" + isActive + "' WHERE [ID] = " + lblID.Text;
SqlDataSource1.UpdateCommand = SqlStr;
SqlDataSource1.Update();
}
}
}
protected void cvAccountNumber_ServerValidate(object source, ServerValidateEventArgs args)
{
TextBox txtAccountNumber = RadGrid1.FindControl("txtAccountNumber") as TextBox;
List<GridDataItem> Items = (from item in RadGrid1.Items.Cast<GridDataItem>()
where item["AccountNumberView"].Text == txtAccountNumber.Text
select item).ToList();
args.IsValid = Items.Count() == 0;
}
}
"Insérer un élément est uniquement disponible lorsque la grille est en mode insertion."
C'est seulement quand il est exécuté en essayant de mettre à jour en mode édition. les erreurs de la GetInsertItem()
OriginalL'auteur the sandman | 2012-10-02
Vous devez vous connecter pour publier un commentaire.
Il semble que le contrôle GridView.FindControl à l'intérieur de valider événement ne fonctionne jamais, jamais comment vous pouvez accéder à la chaîne qui doit être validé comme ceci:
C'est une façon de valider la cible de la valeur du contrôle:
Et voici comment vous pouvez accéder à des contrôles effectifs. GridView.FindControl va se retrouver avec rien lors de l'utilisation à l'intérieur ServerValidate contexte, de sorte que vous avez à regarder à l'intérieur d'édition/ligne insérée.
Il devrait, si vous n'êtes pas buiding gridview au moment de l'exécution. Aller à designview et de modifier des modèles. Dans le menu déroulant, sélectionnez EditItemTemplate. Ensuite, vous devriez voir votre zone de texte.
ok je l'ai trouvé et il ressemble déjà eu l'ID défini. Voici une capture d'écran: lien
C'est ok, maintenant, il suffit d'utiliser le code de mon échantillon et le serveur doivent trouver cette zone de texte.
Je reçois le "la référence d'Objet n'est pas définie à une instance d'un objet." erreur.
OriginalL'auteur Gregor Primar
Tout d'abord votre code est sujette à l'injection SQL, mais ce n'est pas votre question initiale.
Vous ne pouvez pas faire une boucle par GridDataItems de trouver des doublons. Vous ne serez pas en mesure de le trouver si plus tard vous paginer votre grille.
À première, vous pouvez utiliser InsertCommand et UpdateCommand événements de RadGrid pour des raisons de simplicité. Vérifiez ensuite le reproduire en utilisant ADO.Net ou quelle que soit la méthode que vous préférez.
Je suis heureux que vous obtenir votre problème résolu. Si vous n'avez pas l'esprit, je tiens à vous suggérons d'utiliser des Requêtes Paramétrées pour empêcher l'injection SQL. functionx.com/aspnet_csharp/articles/parameterized.htm
OriginalL'auteur Win
C'est ce que je suggère, et comment takle cette question.
Placez un point d'arrêt dans le code où vous obtenez l'erreur.
Exécuter le programme de Débogage. Le programme s'arrête au point de rupture.
Dans la fenêtre ajouter votre objet et de voir quelles sont les valeurs qu'il contient. N'ayez pas peur. Fenêtre d'observation est très puissant. Vous pouvez ajouter un objet ou d'un de ses biens pour voir ce que la valeur qu'il contient. Vous souhaitez concentrer sur la valeur null.
Une fois que vous identifier à l'exception nulle d'où il vient, fixer que la syntaxe de droit dans la fenêtre Watch et exécutez à nouveau le programme.
OriginalL'auteur Hammad Khan