基于文本框输入生成DataGrid行遇System.OutOfMemoryException问题求助
解决Web端根据输入生成DataGrid行的内存溢出问题
我一眼就瞅出你代码里的致命问题了——那个无限循环直接把内存给撑爆了!咱们一步步来把问题捋顺、修复:
核心问题分析
你写的for (; ; )是个死循环,而且循环体里i的值从来没递增(没有i++操作),导致i < rowTotal永远成立,程序会不停地往TempTable里插入空行,直到内存耗尽,最终抛出OutOfMemoryException。
另外还有个可以优化的点:你现在每添加一行就调用一次grid1.DataBind(),这会频繁触发控件渲染,既浪费性能又完全没必要,应该等所有行都添加完成后再一次性绑定。
修正后的完整代码
private DataTable TempTable { get { return (DataTable)ViewState["TempTable"]; } set { ViewState["TempTable"] = value; } } public void dtTemp() { TempTable = new DataTable(); TempTable.Columns.Add("ID_", typeof(string)); TempTable.Columns.Add("Name_", typeof(string)); TempTable.Columns.Add("Phone_", typeof(string)); } protected void btnAdd_Click(object sender, ImageClickEventArgs e) { // 先做输入验证,避免用户输入非数字导致报错 if (!int.TryParse(totalRow.Text, out int rowTotal)) { // 这里可以给用户加个提示,比如Label.Text = "请输入有效的数字" return; } panelTest.Visible = true; dtTemp(); // 用标准for循环控制生成行数,避免无限循环 for (int i = 0; i < rowTotal; i++) { DataRow dr = TempTable.NewRow(); dr["ID_"] = ""; dr["Name_"] = ""; dr["Phone_"] = ""; TempTable.Rows.Add(dr); } // 所有行添加完成后,一次性绑定DataGrid,提升性能 grid1.DataSource = TempTable; grid1.DataBind(); }
关键改进点说明
- 修复无限循环:把死循环改成标准的
for (int i = 0; i < rowTotal; i++),确保循环只执行rowTotal次就停止。 - 添加输入验证:用
int.TryParse替代直接Int32.Parse,防止用户输入非数字内容导致格式转换异常,让代码更健壮。 - 优化DataGrid绑定:把
DataBind()移到循环外部,只执行一次,减少不必要的控件渲染操作,提升页面响应速度。
内容的提问来源于stack exchange,提问作者illimite
相关产品推荐
相关产品推荐

