问题描述:我要做一个单位选择页面,在一个GV里选择完单位后会插入到另一个GV里,之前还很正常,后面不知道改了什么就变成后台debug的时候确定插入的GridView是有绑定了数据的,但是前端却没有正常显示数据
<asp:GridView ID="gv_bl" runat="server" AutoGenerateColumns="false" CssClass="grid" EmptyDataText="查无数据!" onrowdatabound="gv_bl_RowDataBound" Width="1200px" ShowFooter ="true">
<Columns>
<asp:BoundField HeaderText="序号" />
<asp:BoundField DataField="agencyno" HeaderText="单位编码" />
<asp:BoundField DataField="agencyname" HeaderText="单位名称" />
<asp:TemplateField HeaderText="比例(%)" ItemStyle-HorizontalAlign="Left">
<ItemTemplate>
<asp:TextBox ID="txt_scale" runat="server" AutoPostBack="True" class="wdate" ontextchanged="txt_scale_TextChanged" Text='<%# Eval("ratio") %>' Width="90px"></asp:TextBox>
</ItemTemplate>
<HeaderStyle ForeColor="#CC3300" />
</asp:TemplateField>
<asp:TemplateField HeaderText="码洋" ItemStyle-HorizontalAlign="Left">
<ItemTemplate>
<asp:TextBox ID="txt_bdmayang" runat="server" AutoPostBack="True" class="wdate" ontextchanged="txt_bdmayang_TextChanged" Text='<%# Eval("mayang") %>' Width="90px" ></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="money" HeaderText="实洋" />
<asp:BoundField DataField="djprice" HeaderText="底价" />
<asp:TemplateField HeaderText="删除" ItemStyle-Width="80">
<ItemTemplate>
<asp:LinkButton ID="lb_dwdel" runat="server" CausesValidation="false" onclick="lb_dwdel_Click">删除</asp:LinkButton>
</ItemTemplate>
<ItemStyle HorizontalAlign="Center" />
</asp:TemplateField>
</Columns>
</asp:GridView>
这是前端代码↑
这是后端代码↓
protected void btn_item_add_Click(object sender, EventArgs e)
{
try
{
//SetData();
List<Orsrtb16> orlist = new List<Orsrtb16>();
orlist = orlist.GroupBy(x => x.AgencyNo).Select(x => x.First()).ToList();
Session["comlist"] = orlist;
//创建临时数据源,先暂时存下已有数据
DataTable tempdt = new DataTable();
DataColumn dc1 = null;
dc1 = tempdt.Columns.Add("ID", Type.GetType("System.Int32"));
dc1.AutoIncrement = true;
dc1.AutoIncrementSeed = 1;
dc1.AutoIncrementStep = 1;
dc1.AllowDBNull = false;
double Ratio = 0;
decimal Mayang = 0;
decimal Money = 0;
decimal Price = 0;
dc1 = tempdt.Columns.Add("agencyno", Type.GetType("System.String"));
dc1 = tempdt.Columns.Add("agencyname", Type.GetType("System.String"));
dc1 = tempdt.Columns.Add("ratio", Type.GetType("System.String"));
dc1 = tempdt.Columns.Add("money", Type.GetType("System.String"));
dc1 = tempdt.Columns.Add("djprice", Type.GetType("System.String"));
dc1 = tempdt.Columns.Add("mayang", Type.GetType("System.String"));
//插入分配列表已有记录到临时数据源
for (int j = 0; j < gv_bl.Rows.Count; j++)
{
DataRow row = tempdt.NewRow();
TextBox ratio = gv_bl.Rows[j].FindControl("txt_scale") as TextBox;
TextBox mayang = gv_bl.Rows[j].FindControl("txt_bdmayang") as TextBox;
row["agencyname"] = gv_bl.Rows[j].Cells[2].Text;
row["agencyno"] = gv_bl.Rows[j].Cells[1].Text;
row["ratio"] = ratio.Text;
row["money"] = gv_bl.Rows[j].Cells[5].Text;
row["mayang"] = mayang.Text;
row["djprice"] = gv_bl.Rows[j].Cells[6].Text;
Ratio += Convert.ToDouble(ratio.Text);
Mayang += Convert.ToDecimal(mayang.Text);
Money += Convert.ToDecimal(gv_bl.Rows[j].Cells[5].Text);
Price += Convert.ToDecimal(gv_bl.Rows[j].Cells[6].Text);
tempdt.Rows.Add(row);
}
for (int i = 0; i < gv_com.Rows.Count; i++)
{
CheckBox ck = gv_com.Rows[i].FindControl("cb_item") as CheckBox;
if (ck.Checked == true)
{
//添加
DataRow row1 = tempdt.NewRow();
row1["agencyname"] = gv_com.Rows[i].Cells[3].Text;
row1["agencyno"] = gv_com.Rows[i].Cells[2].Text;
row1["ratio"] = "0";
row1["money"] = "0";
row1["mayang"] = "0";
row1["djprice"] = "0";
tempdt.Rows.Add(row1);
}
}
//排重
for (int k = 0; k < tempdt.Rows.Count; k++)
{
for (int m = tempdt.Rows.Count - 1; m > 0; m--)
{
if (k != m && tempdt.Rows[k]["agencyno"].ToString() == tempdt.Rows[m]["agencyno"].ToString())
{
tempdt.Rows.RemoveAt(k);
k--;
m = tempdt.Rows.Count - 1;
break;
}
}
}
for (int i = 0; i < tempdt.Rows.Count; i++)
{
orlist.Add(WriteData(i, tempdt));
}
if (Session["comlist"] == null)
{
Session.Add("comlist", orlist);
}
else
{
Session["comlist"] = null;
Session.Add("comlist", orlist);
}
lblHratio.Text = Math.Round(Ratio, 2).ToString();
lblHmayang.Text = Math.Round(Mayang, 2).ToString();
lblHmoney.Text = Math.Round(Money, 2).ToString();
lblHDjsy.Text = Math.Round(Price, 2).ToString();
gv_bl.Visible = true;
gv_bl.Enabled = true;
gv_bl.DataSource = tempdt;
gv_bl.DataBind();
gv_bl.FooterRow.Cells[3].Text = "0";
gv_bl.FooterRow.Cells[4].Text = "0";
gv_bl.FooterRow.Cells[5].Text = "0";
gv_bl.FooterRow.Cells[6].Text = "0";
}catch(Exception ex)
{
ScriptManager.RegisterStartupScript(this.UpdatePanel1, this.GetType(), "alertScript", "<script>alert(" + ex.ToString() + ")</script>", false);
return;
}
}
正常显示页面↓
异常显示↓
相关控件代码↓
<asp:Button ID="btn_item_add" runat="server" CssClass="btn" Height="22px" onclick="btn_item_add_Click" Text="添加单位" />
排查了好久,网上查了很多,诸如GV的列名没跟绑定的数据源对应上,控件问题什么的,仍然没有解决问题,还望大佬们帮帮忙,看看结症在何处🙏🙏🙏
==========================问题原因==========================
问了现实中的大佬,说会不会是UpdatePanel的原因,试着根据提示去找原因,还真是。。。
原来的【添加单位】按钮被我放在了UpdatePanel3里面,而进行数据写入的GridView被我直接放在了form里面,当我把按钮移到form里面后,数据就正常显示了
但是这样按钮摆放的位置就不够合理,于是了解了一下UpdatePanel,看看怎么在UpdatePanel中实现可回发按钮对外部的刷新,以下内容对我起到了帮助↓
updatePanel有两个属性,一个是AsyncPostBackTrigger属性,一个是PostBackTrigger属性;
第一个属性用来指定UpdatePanel外的控件,如Button,ImageButton等可回发控件对UpdatePanel的刷新。如果没有指定,点击按钮会对UpdatePanel进行刷新,但不是异步更新,而是整页传送;第二个属性是用来指定UpdatePanel中可回发的控件,对外部的刷新。如果不指定,则点击UpdatePanel中可回发的控件,对外面的页面内容不能刷新。
资料地址:ASP.NET之UpdatePanel控件 - 全栈程序员必看 (javaforall.cn)
根据资料中的指引用PostBackTrigger指定了【添加单位】控件,经测试,代码顺利运行。
这个问题就此解决!本菜鸟又获得了新的经验 get✔
编译器:VS2019