ASP.Net Gridview, как активировать режим редактирования на основе ID (DataKey)
У меня есть страница, назовем ее SourceTypes.aspx, который имеет A GridView, отображающий список типов источников. Часть GridView-это DataKey, SourceTypeID. Если исходный TypeID передается на страницу через запрос sting, как я могу перевести Gridview в режим редактирования для соответствующей строки на основе SourceTypeID?
GridView привязан к объекту SQlDataSource.
У меня такое чувство, что я собираюсь ударить себя, когда появится ответ!!
Я посмотрел на программно переводим строку gridview в режим редактирования но это несколько не хватает специфики
2 ответов:
Это немного сложнее, когда вы хотите перевести его в режим редактирования на основе данных. Вы указываете datagrid, какая из отображаемых строк является редактируемой, а не какие данные вы хотите редактировать, поэтому вам нужно будет просмотреть каждую из строк в сетке, посмотреть, соответствует ли она идентификатору, и установить EditItemIndex в соответствующее значение и выполнить повторную привязку.
Вы можете посмотреть исходные данные и получить номер строки из них перед привязкой, но тогда у вас могут возникнуть проблемы с подкачкой, сортировкой и т.д.
Это немного неприятно, когда приходится заново привязывать сетку, но я не могу придумать лучшего способа, чтобы снять ее с моей головы.
public partial class _Default : System.Web.UI.Page { private DataTable GetData() { DataTable tTable = new DataTable(); tTable.Columns.Add(new DataColumn("Column1", typeof(int))); tTable.Columns.Add(new DataColumn("Column2", typeof(string))); DataRow tRow = tTable.NewRow(); tRow["Column1"] = 1; tRow["Column2"] = "Test1"; tTable.Rows.Add(tRow); tRow = tTable.NewRow(); tRow["Column1"] = 2; tRow["Column2"] = "Test2"; tTable.Rows.Add(tRow); tRow = tTable.NewRow(); tRow["Column1"] = 3; tRow["Column2"] = "Test3"; tTable.Rows.Add(tRow); tRow = tTable.NewRow(); tRow["Column1"] = 4; tRow["Column2"] = "Test4"; tTable.Rows.Add(tRow); tRow = tTable.NewRow(); tRow["Column1"] = 5; tRow["Column2"] = "Test5"; tTable.Rows.Add(tRow); return tTable; } private void BindData() { DataTable tTable = GetData(); TestGrid.DataSource = tTable; TestGrid.DataBind(); if (!String.IsNullOrEmpty(Request.QueryString["edit"])) { foreach (DataGridItem tRow in TestGrid.Items) { if (tRow.Cells[0].Text == Request.QueryString["edit"]) TestGrid.EditItemIndex = tRow.ItemIndex; } TestGrid.DataBind(); } } protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) BindData(); } }Вы должны быть в состоянии запустить это (с датагридом, добавленным к ASPX, очевидно), а затем положить ?edit= в конце URL-адреса, чтобы заставить его открыть соответствующую запись в режиме редактирования.
Прежде всего, большое спасибо Стиву Робинсу за то, что он помог мне встать на правильный путь. Мой подход был немного другим, частично из-за того, что я не использовал метод привязки данных.
Я использую комбинацию событий OnRowDataBound и OnDataBound объекта DataView. Событие OnRowDataBound для определения индекса строки, подлежащей переводу в режим редактирования. Событие OnDataBound задает индекс и повторно связывает DataView.
Переменная используется для того, чтобы убедиться, что представление не является непрерывный отскок.
Вот суть страницы aspx, отредактированной для краткости.
<asp:GridView ID="GridView1" runat="server" DataSourceID="CreativeTypeDS" AutoGenerateColumns="False" DataKeyNames="SourceCreativeTypeID" EmptyDataText="No Cretive Types at this time." CellPadding="3" CellSpacing="1" OnRowDataBound="GridView1_RowDataBound" OnDataBound="GridView1_DataBound" > <Columns> [Template Columns Here] </Columns> </asp:GridView> <asp:SqlDataSource ID="CreativeTypeDS" runat="server" SelectCommand="cmsSourceCreativeTypeSel" SelectCommandType="StoredProcedure" UpdateCommand="cmsSourceCreativeTypeUpd" UpdateCommandType="StoredProcedure"> <SelectParameters> <asp:Parameter Name="Active" DefaultValue="0" /> </SelectParameters> <UpdateParameters> <asp:Parameter Name="SourceCreativeTypeID" Type="Int32" /> <asp:Parameter Name="SourceCategoryID" Type="Int32"/> <asp:Parameter Name="Name" Type="String" /> <asp:Parameter Name="Active" Type="Boolean" /> </UpdateParameters> </asp:SqlDataSource>А теперь о коде позади.
public partial class SourceCreativeTypes : System.Web.UI.Page { private int? EditIndex = null; private bool GridRebound = false; protected override void OnPreInit(EventArgs e) { CreativeTypeDS.ConnectionString = "[CONNECTION STRING MAGIC HERE]"; } protected void Page_Load(object sender, EventArgs e) { if (IsPostBack) { //Dont Want to set edit row manualy if post back GridRebound = true; } } //Use the Row Databound Event to find the row to put into edit mode protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { if (!String.IsNullOrEmpty(Request.QueryString["ID"])) { //Get Target ID from Query String string sSourceCreativeTypeID = Request.QueryString["ID"]; //Get data for row being bound DataRowView rowView = (DataRowView)e.Row.DataItem; // Set index if we are in a "normal row", the row data // has been retrieved // and the Supplied ID matches that of this row if ((e.Row.RowState == DataControlRowState.Normal || e.Row.RowState == DataControlRowState.Alternate) && (rowView != null && rowView["SourceCreativeTypeID"].ToString() == sSourceCreativeTypeID) ) { EditIndex = e.Row.RowIndex; } } } /* Use the Datbound Event to set the required row to index mode * Then Rebind the grid. Rebinding in Row Databound does not work * for Reasons unknown */ protected void GridView1_DataBound(object sender, EventArgs e) { //Set Gridview edit index if one is supplied and page is not a post back if (!GridRebound && EditIndex != null) { //Setting GridRebound ensures this only happens once GridRebound = true; GridView1.EditIndex = (int)EditIndex; GridView1.DataBind(); } } } }Надеюсь, между Стивом и мной мы поможем некоторым из вас там
Comments