Dynamisch hinzugefügte Steuerelemente fehlt in GridView RowUpdating
Ich habe ein GridView mit einem TemplateField-Spalte, dass ich Platzhalter-controls. Während der Datenbindung Ereignis für das GridView ich dynamisch fügen Sie ein paar Kontrollkästchen, um die Platzhalter. Das funktioniert auch und zeigt als erwartet.
Mein problem ist, dass während das RowUpdating-Ereignis der Platzhalter enthält keine Steuerelemente; meine Checkboxen fehlen. Mir ist auch aufgefallen, dass Sie fehlen bei der RowEditing Veranstaltung.
Ich möchte in der Lage sein, um die Werte der Kontrollkästchen, während das RowUpdating-Ereignis, so kann ich diese speichern in der Datenbank.
Hier einige Beispiel-code. Ich habe getrimmt, eine Menge, um Größe zu reduzieren, aber wenn Sie wollen, um zu sehen, Einzelheiten einfach Fragen und ich werde glücklich sein, um mehr hinzuzufügen.
HTML:
<asp:GridView ID="gridView" runat="server" AutoGenerateColumns="False"
ondatabound="gridView_DataBound" onrowupdating="gridView_RowUpdating"
onrowediting="gridView_RowEditing" DataKeyNames="ID">
<Columns>
<asp:TemplateField HeaderText="Countries">
<ItemTemplate>
<asp:PlaceHolder ID="countriesPlaceHolder" runat="server"></asp:PlaceHolder>
</ItemTemplate>
<EditItemTemplate>
<asp:PlaceHolder ID="countriesPlaceHolder" runat="server"></asp:PlaceHolder>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField ShowHeader="False">
<ItemTemplate>
<asp:LinkButton ID="editButton" runat="server" CommandName="Edit" Text="Edit"></asp:LinkButton>
</ItemTemplate>
<EditItemTemplate>
<asp:LinkButton ID="updateButton" runat="server" CommandName="Update" Text="Update"></asp:LinkButton>
</EditItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Code hinter:
//This method works fine, no obvious problems here.
protected void gridView_DataBound(object sender, EventArgs e)
{
//Loop through the Holidays that are bound to the GridView
var holidays = (IEnumerable<Holiday>)gridView.DataSource;
for (int i = 0; i < holidays.Count(); i++)
{
//Get the row the Holiday is bound to
GridViewRow row = gridView.Rows[i];
//Get the PlaceHolder control
var placeHolder = (PlaceHolder)row.FindControl("countriesPlaceHolder");
//Create a CheckBox for each country and add it to the PlaceHolder
foreach (Country country in this.Countries)
{
bool isChecked = holidays.ElementAt(i).Countries.Any(item => item.ID == country.ID);
var countryCheckBox = new CheckBox
{
Checked = isChecked,
ID = country.Abbreviation + "CheckBox",
Text = country.Abbreviation
};
placeHolder.Controls.Add(countryCheckBox);
}
}
}
protected void gridView_RowEditing(object sender, GridViewEditEventArgs e)
{
//EXAMPLE: I'm expecting checkBoxControls to contain my CheckBoxes, but it's empty.
var checkBoxControls = gridView.Rows[e.NewEditIndex].FindControl("countriesPlaceHolder").Controls;
gridView.EditIndex = e.NewEditIndex;
BindData();
}
protected void gridView_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
//EXAMPLE: I'm expecting checkBoxControls to contain my CheckBoxes, but it's empty.
var checkBoxControls = ((PlaceHolder)gridView.Rows[e.RowIndex].FindControl("countriesPlaceHolder")).Controls;
//This is where I'd grab the values from the controls, create an entity, and save the entity to the database.
gridView.EditIndex = -1;
BindData();
}
Dies ist der Artikel, ich folgte meinem data binding-Ansatz: http://www.aarongoldenthal.com/post/2009/04/19/Manually-Databinding-a-GridView.aspx
Ja, in meinem eigentlichen code, den ich tun es Stimmen, die zu einem Platzhalter. Ich habe auch eine überprüfung durchführen, auf die RowType, wie Sie vorgeschlagen. Danke für die Anregung.
Ich kann nicht sehen, wo Sie überprüfen RowType..
Überprüfen dieser Antwort auf StackOverflow als gut und sehen, ob es helfen wird, klingt wie dasselbe Problem.. stackoverflow.com/questions/7343943/...
Sorry, ich meinte mit meinem eigentlichen code, im Gegensatz zu den sample-code, den ich oben gepostet. Ich habe allerdings gerade aktualisiert, der Beispielcode ist
gridView_RowUpdating
und sogar es getestet auf mein Ende, aber kein Glück noch. Auch ich habe die link, aber das scheint nicht mein problem sein. Ich beschäftige mich mit der richtigen Zeile; ich habe festgestellt, dass während des Debuggens.
InformationsquelleAutor Ecyrb | 2012-02-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie rufen Sie Ihren BindData () - Methode, die beim laden der Seite.
"Dynamischen Steuerelementen oder Spalten müssen neu erstellt werden, die auf jeder Seite laden, weil der Weg, dass die Kontrollen funktionieren. Dynamische Steuerelemente nicht bekommen, beibehalten, so müssen Sie neu laden Sie Sie auf jeder Seite postback; jedoch viewstate gespeichert werden, werden diese kontrolliert."
Sehen Zellen in gridview verlieren Steuerelemente auf RowUpdating-Ereignis
Auch in dem Artikel, den Sie verlinkt, es ist ein ItemTemplate und ein EditItemTemplace, weil Sie verschiedene anzeigen, d.h. nur gelesen und bearbeitet werden. Ihnen sind die gleichen, so dass ich denke, man könnte vereinfachen Sie Ihr design:
Code Hinter:
Wenn Sie wollen, um es ermöglichte, aus der sich gehen, entfernen Sie einfach die checks für den enabled Status und Sie können Sie löschen, edit-Knopf.
Hoffe, das hilft.
BindData()
während Seite zu laden, aber dann merkte ich, ich war nur aufrufen, während nicht-postbacks. Ich Zwickte die Logik nur aufrufenBindData()
auf nicht-postbacks, aber nennen Sie meinen code fügt hinzu, dass die dynamische Checkboxen auf jede Belastung. Das war der trick! Danke!InformationsquelleAutor Renae