我目前在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
用于搜索字符串,一个搜索提交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();
}
事件以更改单元格的值之前。我将行设置为可编辑:
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}} 中的
现在,我只需要动态地将模板与下拉列表中的值绑定,我认为就是这样。
谢谢!
答案 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
。