GridView RowUpdating не получает новые значения - PullRequest
0 голосов
/ 20 октября 2011

У меня сейчас проблема с RowUpdating из GridView и доступом к новым значениям. Я добавляю динамический DataTable к своему GridView.DataSource и привязываюсь к нему. Если я использую кнопку обновления, ничего не происходит, и я возвращаюсь к своему обычному GridView. Вот мое событие Page_Load:

protected void Page_Load(object sender, EventArgs e)
{
    Control test = GetPostBackControl(Page);
    if (Page.IsPostBack)
    {
        if ((test.ID == "SumbitSearch") && (DropDownListFrom.Text != "") && (DropDownListTo.Text != "") && (SearchField.Text != ""))
        {
            DataTable result = new DataTable();
            string from = null;
            string to = null;

            switch (DropDownListFrom.SelectedIndex)
            {
                case 0:
                    from = DropDownListFrom.Items[0].Value;
                    break;
                case 1:
                    from = DropDownListFrom.Items[1].Value;
                    break;
                case 2:
                    from = DropDownListFrom.Items[2].Value;
                    break;
            }

            switch (DropDownListTo.SelectedIndex)
            {
                case 0:
                    to = DropDownListTo.Items[0].Value;
                    break;
                case 1:
                    to = DropDownListTo.Items[1].Value;
                    break;
                case 2:
                    to = DropDownListTo.Items[2].Value;
                    break;
            }

            result = LoadGridView(from, to);
            GridViewResult.DataSource = result;
            Session["Result"] = result;
            GridViewResult.DataBind();

            GridViewResult.Columns[0].Visible = true;
            GridViewResult.Columns[1].Visible = true;

            GridViewResult.HeaderRow.Cells[0].Width = Unit.Pixel(110);
            GridViewResult.HeaderRow.Cells[1].Width = Unit.Pixel(60);
            GridViewResult.HeaderRow.Cells[3].Text = "Nach: " + from;
            GridViewResult.HeaderRow.Cells[4].Text = "Von: " + to;
        }
    }
    else
    {
        GridViewResult.DataBind();
    }
}

Позже, GridView должен появляться, только если используются оба DropDownList s и SearchField не пусто. Я также проверяю, является ли кнопка, которая выполняет PostBack, кнопкой поиска.

Вот что я добавил к RowUpdating EventHandler:

protected void TaskGridViewResult_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    GridViewResult.DataSource = (DataTable)Session["Result"];
    for (int i = 0; i < GridViewResult.Columns.Count; i++)
    {
        DataControlFieldCell cell = GridViewResult.Rows[e.RowIndex].Cells[i] as DataControlFieldCell;
        GridViewResult.Columns[i].ExtractValuesFromCell(e.NewValues, cell, DataControlRowState.Edit, true);
    }

    GridViewResult.EditIndex = -1;
    DataBind();
}

Что не так?

Последнее изменение: Дополнительная информация (@jwiscarson)

Извините, я торопился. Я постараюсь дать вам лучший обзор. В этом проекте пользователи могут выбрать 2 категории, ввести строку поиска, и результат отобразится в GridView. Материал RowUpdating предназначен для "администратора". Вот моя проблема, если «пользователь-администратор» нажмет на редактировать, изменит значение ячейки и выполнит обновление, значение не будет изменено в DataTable.

Не видя вашей разметки, трудно […] на основании некоторого поиска критерии?

Я добавляю GridViewResult в качестве разметки в моем проекте.

Я также не уверен, почему […] в событии Click этой кнопки.

Да, я тоже так думал! Но я читал в блоге, что лучше поместить код в Page_Load (), если вы работаете с GridViews. Я поверил ему. Можно ли поместить этот код в обработчик события click из моей кнопки? Я очень новичок в этом. Я просто мог прочитать много блогов, msdn и спросить здесь.

TaskGridViewResult_RowUpdating также добавлено в качестве разметки к моему коду. Могу ли я также создать это и GridView в моем CreateChildControls()?

В качестве наценки у меня есть два DropDownLists, TextBox для строки поиска, запрос на поиск Button и GridView.

На данный момент у меня нет точного кода, но GridView выглядит так:

<asp:GridView ID="GridView1" runat="server"
    OnRowUpdating="TaskGridViewResult_RowUpdating">
    <!-- // More of that... -->
    <Columns>
        <asp:CommandField ShowEditButton="True" />
        <asp:CommandField ShowDeleteButton="True" />
    </Columns>
</asp:GridView>

Я мог бы дать вам более подробную информацию завтра.

Может быть, я забыл это. Прежде чем я смог нажать кнопку обновления и выполнить событие TaskGridViewResult_RowUpdating, чтобы изменить значение ячейки. Я устанавливаю строку, редактируемую с помощью:

 protected void TaskGridViewResult _RowEditing(object sender, GridViewEditEventArgs e)
  {
    GridViewResult.EditIndex = e.NewEditIndex;
    DataBind();
  }

Следующее изменение: Я добавил в GridView несколько TemplateField таких как:

<asp:TemplateField HeaderText="test">
    <EditItemTemplate>
        <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("from") %>'>   </asp:TextBox>
    </EditItemTemplate>
    <ItemTemplate>
        <asp:Label ID="Label2" runat="server" Text='<%# Bind("from") %>'></asp:Label>
    </ItemTemplate>
</asp:TemplateField>

Вот и все, у меня есть доступ к новому значению с помощью:

string test = ((TextBox)row.FindControl("TextBox1")).Text;

in TaskGridViewResult_RowUpdating()

Теперь мне просто нужно динамически связать шаблон со значениями из выпадающего списка, и это все, я думаю.

Спасибо!

1 Ответ

1 голос
/ 20 октября 2011

Ху, мальчик.

Вы не задавали это в своем вопросе, но вы написали какой-то вонючий код здесь. Я постараюсь ответить на ваш вопрос, но я также собираюсь решить некоторые другие проблемы здесь.

Не видя вашей разметки, мне сложно сказать, если вы создали GridViewResult программно или она тоже есть в вашей разметке. Я не совсем уверен, что такое TaskGridViewResult - это событие для GridViewResult? У вас есть еще GridView на вашей странице, и вы хотите показать GridViewResult на основе некоторых критериев поиска?

Я также не уверен, почему вы положили весь свой код привязки GridView в Page_Load. Я вижу, что вы проверяете GetPostBackControl, чтобы найти элемент управления, вызвавший PostBack - это запах кода. Если вашим пользователям приходится нажимать определенную кнопку «Поиск», вы должны изолировать свой код привязки GridView в событии Click этой кнопки.

В любом случае, что касается TaskGridViewResult_RowUpdating:

Похоже, вы пытаетесь обновить старые значения GridViewResult до новых значений, установив его DataSource и затем повторив его данные. Вы не можете сделать это. Что происходит, когда вы меняете событие RowUpdating на:

protected void TaskGridViewResult_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    GridViewResult.DataSource = (DataTable)Session["Result"];
    GridViewResult.DataBind();
}

Теперь, другие стороны:

Ваши операторы switch являются запахами кода. DropDownList s предоставляет свойство с именем SelectedValue - если у вас есть какое-то значение по умолчанию, которое не является допустимым выбором (например, первая опция в DropDownList), вы можете изменить свой исходный код с:

if ((test.ID == "SumbitSearch") && (DropDownListFrom.Text != "") && (DropDownListTo.Text != "") && (SearchField.Text != ""))
{
    string from = string.Empty;
    string to = string.Empty;

    switch (DropDownListFrom.SelectedIndex)
    {
        case 0:
            from = DropDownListFrom.Items[0].Value;
            break;
        /* other cases */
    }

    switch (DropDownListTo.SelectedIndex)
    {
        case 0:
            to = DropDownListTo.Items[0].Value;
            break;
        /* other cases */
    }
    /* snip */
}

до:

if (test.ID == "SubmitSearch" && DropDownListFrom.SelectedIndex > 0 && DropDownListTo.SelectedIndex > 0 && SearchField.Text != "")
{
    string from = DropDownListFrom.SelectedValue;
    string to = DropDownListTo.SelectedValue;

    /* snip */
}

Если можете, пожалуйста, оставьте свою разметку. Я могу предложить вам более конкретную помощь или совет, если я могу рассказать, что Controls у вас есть на вашей странице и как они взаимодействуют.

Редактировать: Я должен также добавить, что вы должны привыкнуть использовать String.IsNullOrEmpty(string variable), а не сравнивать с "". Хотя это не такая большая проблема, когда вы ссылаетесь на текст из веб-элементов управления, использование привычки теперь предотвратит вас от серьезных головных болей и неэффективной проверки на пустые и пустые значения позже. Если вы находитесь в .NET 4.0, у вас должен быть доступ к IsNullOrWhiteSpace(), что (на мой взгляд) более полезно в Интернете, где пользователи с большей вероятностью попытаются ввести нежелательные данные.

Редактировать 2: В ответ на ваши дополнительные данные выше:

В вашем RowUpdating событии вам нужно извлечь новые значения из интерфейсных элементов управления, а затем повторно связать ваши данные. Похоже, ваш исходный код довольно близок к исходному коду MSDN здесь . Разница между вашим кодом и кодом в MSDN: - Код MSDN берет новые данные из отредактированной строки и обновляет соответствующие данные в переменной Session этими новыми данными. - Код MSDN имеет функцию BindData(). Однако я не уверен, что это ваша функция DataBind(). - Код MSDN обновляет GridView путем повторной привязки GridView к соответствующим данным в Session.

Честно говоря, у меня есть некоторые проблемы с кодом MSDN. Я действительно, действительно ненавижу видеть код вроде: dt.Rows[row.DataItemIndex]["Id"] = ((TextBox)(row.Cells[1].Controls[0])).Text; Для меня это мусор, потому что он так сильно связан с порядком ваших клеток.

Если бы я написал код, я бы явно создал все внешние элементы управления и использовал команду привязки (если вы не знакомы, в разметке это выглядит как <%# DataBinder.GetPropertyValue(Container.DataItem, "FieldName") %> - см. Подробнее здесь ). Затем в моем RowUpdating событии я использовал бы e.Row.FindControl("controlName") и обновил бы Session данные из этого.

Честно говоря, если ваши внутренние данные не меняются на регулярной основе, я не вижу причин для программного создания ваших GridView s. Ваш код C # усложняет выполнение этих шагов самостоятельно, когда вы можете просто установить его один раз в своей разметке. Если вам нужно скрыть один GridView, вы всегда можете установить для его свойства Visible значение false. Затем, когда вы будете готовы показать его, установите Visible = true.

Наконец, я распространил свой код GridView на очень много событий (нажатия кнопок, RowDataBound события из других GridViews / Repeaters и т. Д.), Я не могу себе представить, почему кто-то предложил Вы только положили это в Page_Load.

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