GridView RowUpdating不会获取新值

时间:2011-10-20 13:33:38

标签: c# events gridview

我目前在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并且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(); }

的内容
DataTable

出了什么问题?

上次更改:更多信息(@jwiscarson)

对不起,我很着急。我会尽力给你一个更好的看法。 在该项目中,用户可以选择2个类别,输入搜索字符串,结果将显示在GridView中。 RowUpdating的内容是“管理员用户”。 这是我的问题,如果“管理员用户”点击编辑,更改单元格的值并执行更新,则GridViewResult中的值不会更改。

  

没有看到你的标记,基于某些搜索很难[...]   标准是什么?

我在项目中添加GridViews作为标记。

  

我也不确定该按钮的Click事件中的原因。

是的,我也这么认为!但是我在博客中看到,如果您正在使用TaskGridViewResult_RowUpdating,最好将代码放入Page_Load()。我相信他。将代码放入我的按钮的click事件处理程序中是否可以?我很陌生。我只是可以阅读很多博客,msdn并在这里问。

CreateChildControls()也作为标记添加到我的代码中。我可以在我的DropDownLists中创建这个和GridView吗?

作为标记,我有两个TextBox,一个Button用于搜索字符串,一个搜索提交GridViewGridView

目前,我还没有确切的代码,但<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(); } 事件以更改单元格的值之前。我将行设置为可编辑:

TemplateField

下一步更改: 我在GridView中添加了几个<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;

就是这样,我可以通过以下方式访问新值:

TaskGridViewResult_RowUpdating()
{{1}}

中的

现在,我只需要动态地将模板与下拉列表中的值绑定,我认为就是这样。

谢谢!

1 个答案:

答案 0 :(得分:1)

Hoo boy。

你在问题​​中没有问过这个问题,但你在这里写了一些有臭味的代码。我会尝试解决你的问题,但我也会在这里遇到其他一些问题。

如果没有看到你的标记,我很难判断你是否以编程方式创建了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公开名为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)的习惯,而不是与""进行比较。虽然当您从Web控件引用文本时,这并不是一个大问题,但现在养成习惯会使您免于严重的头痛并且以后无效地检查null和空。如果您使用的是.NET 4.0,则应该可以访问IsNullOrWhiteSpace(),这在我看来(在我看来)在网络上更有用,用户更有可能尝试输入垃圾数据。

修改2 :回复上述其他详细信息:

RowUpdating事件中,您需要从前端控件中提取新值,然后重新绑定数据。您的源代码看起来非常接近MSDN源代码here。您的代码与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") %> - 请参阅更多详细信息{ {3}})。然后,在我的RowUpdating事件中,我会使用e.Row.FindControl("controlName"),并从中更新Session数据。

老实说,如果您的后端数据没有定期更改,我认为没有任何理由以编程方式创建您的GridView。当你可以在标记中设置一次时,它会使你的C#代码过于复杂,无法自己完成这些步骤。如果您需要隐藏一个GridView,则可以始终将其Visible属性设置为false。然后,当您准备好显示它时,请设置Visible = true

最后,我将GridView代码传播到了很多事件(按钮点击,来自其他RowDataBound / GridViews的{​​{1}}个事件等),我可以我想象为什么有人会建议你只把它放在Repeaters