ASP.Net Gridview, как активировать режим редактирования на основе ID (DataKey)



У меня есть страница, назовем ее SourceTypes.aspx, который имеет A GridView, отображающий список типов источников. Часть GridView-это DataKey, SourceTypeID. Если исходный TypeID передается на страницу через запрос sting, как я могу перевести Gridview в режим редактирования для соответствующей строки на основе SourceTypeID?



GridView привязан к объекту SQlDataSource.



У меня такое чувство, что я собираюсь ударить себя, когда появится ответ!!



Я посмотрел на программно переводим строку gridview в режим редактирования но это несколько не хватает специфики

554   2  

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

    Ничего не найдено.