You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于文本框输入生成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(); 
}

关键改进点说明

  1. 修复无限循环:把死循环改成标准的for (int i = 0; i < rowTotal; i++),确保循环只执行rowTotal次就停止。
  2. 添加输入验证:用int.TryParse替代直接Int32.Parse,防止用户输入非数字内容导致格式转换异常,让代码更健壮。
  3. 优化DataGrid绑定:把DataBind()移到循环外部,只执行一次,减少不必要的控件渲染操作,提升页面响应速度。

内容的提问来源于stack exchange,提问作者illimite

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:17:34