ASP.Net Gridview, Как активировать режим редактирования на основе идентификатора (DataKey) - PullRequest
2 голосов
/ 13 января 2009

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

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

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

Я смотрел на Перевод строки вида сетки в режим редактирования программно , но это то, чего не хватает в специфике

Ответы [ 2 ]

2 голосов
/ 28 января 2009

Прежде всего, большое спасибо Стиву Робинсу за то, что он начал меня по правильному пути. Мой подход был немного другим, частично из-за того, что я не использовал метод DataBind.

Я использую комбинацию событий 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();
        }
     }
   } 
}

Надеюсь, между Стивом и Мной мы поможем некоторым из вас там

2 голосов
/ 13 января 2009

Немного сложнее, если вы хотите перевести его в режим редактирования на основе данных. Вы сообщаете сетке данных, какая из отображаемых строк является редактируемой, а не какие данные вы хотите редактировать, поэтому вам нужно будет просмотреть каждую строку в сетке, посмотреть, соответствует ли она идентификатору, и установить для 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, чтобы он открывал соответствующую запись в режиме редактирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...