Я хочу, чтобы RowCommand выполнялся до перезагрузки RowCreate ИЛИ как-то так - PullRequest
0 голосов
/ 26 мая 2011

у меня

<asp:GridView>
<asp:TemplateField HeaderText="PsyHealth">
    <ItemTemplate>
        <asp:PlaceHolder runat="server" ID="PsyHealth" />
    </ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="-">
    <ItemTemplate>
    <asp:LinkButton ID="Gen" CommandName="Gen" runat="server" Text="gen" />
    </ItemTemplate>
</asp:TemplateField>

и

protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        var dataItem = e.Row.DataItem as ViewModels.UserTestorViewModel;
        var psyHealth = e.Row.FindControl("PsyHealth") as PlaceHolder;
        if (psyHealth != null)
        {
            psyHealth.Controls.Add(dataItem.PsyHeath);
        }
    }
}
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
    //bla bla bla
}

но когда я нажал Gen LinkButton на странице. GridView1_RowCreated был запущен первым и выдал ошибку Object reference not set to an instance of an object, поскольку e.Row.DataItem был нулевым.

Редактировать: Код позади

protected void Page_Load(object sender, EventArgs e)
{
    List<ViewModels.UserTestorViewModel> utViewModelList = new List<ViewModels.UserTestorViewModel> { };

    utViewModelList = utRepo.GetUserTestorViewModelListByHrId();

    this.GridView1.DataSource = utViewModelList;
    this.GridView1.DataBind();

    if (!IsPostBack)
    {
    }
}

protected void Page_Init(object sender, EventArgs e)
{
    GridView1.RowCreated += new GridViewRowEventHandler(GridView1_RowCreated);
}

Ответы [ 2 ]

0 голосов
/ 26 мая 2011

Можете ли вы сохранить utViewModelList в сеансе при первом его получении? Если это так, то вы можете получить экземпляр UserTestorViewModel из сохраненного значения DataKey выбранной строки.

0 голосов
/ 26 мая 2011

Когда вы нажимаете любую кнопку в виде сетки, ваша страница отправляется обратно, и событие загрузки страницы вызывается до того, как оно переходит в событие RowCommand. В событии загрузки страницы вы снова привязываете свой gridview, и поэтому ваш RowCreated Event называется.

Вы должны связать свой gridview в if (!IsPostBack)

protected void Page_Load(object sender, EventArgs e)
{

if (!IsPostBack)
{
    List<ViewModels.UserTestorViewModel> utViewModelList = new List<ViewModels.UserTestorViewModel> { };

utViewModelList = utRepo.GetUserTestorViewModelListByHrId();

this.GridView1.DataSource = utViewModelList;
this.GridView1.DataBind();
   }
}

Редактировать: Теперь я получил ваш вопрос после того, как вы отправили код ..

Проблема здесь в Page_Init, вы можете удалить отсюда обработчик событий и попробовать следующее:

protected void Page_Init(object sender, EventArgs e)
{
    GridView1.RowCreated += new GridViewRowEventHandler(GridView1_RowCreated);
}

добавить сюда

<asp:GridView  onrowcreated="GridView1_RowCreated">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...