【问题标题】:Binding RadGrid To DataTable ASP.NET将 RadGrid 绑定到 DataTable ASP.NET
【发布时间】:2015-09-30 05:40:12
【问题描述】:

我想要做的是,在将记录保存到数据库之前,我想在 GridView 中显示记录,即当用户填写文本框并单击按钮时,该记录将显示在 GridView 上,序列号为 1、2 , 3 ... 到目前为止,我已经接近了这个。第一条记录添加成功,但添加第二条记录时 DataTable 给出空引用异常。这是正确的方法吗?或者有没有简单的方法来做到这一点。我正在将 Telerik RadGrid 用于 asp.net 。

 public DataTable dt;
 protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            dt = new DataTable();
            dt.Columns.Add("Sn#");
            dt.Columns.Add("type");
            dt.Columns.Add("AccountTitle");
            dt.Columns.Add("Description");
            dt.Columns.Add("CostCenter");
            dt.Columns.Add("Debit");
            dt.Columns.Add("Credit");
            sno.Text = "1";
        }

    }

  protected void radGridView2_NeedDataSource(object sender, GridNeedDataSourceEventArgs e)
    {
            dt = AddRow(dt);  // call the method to create row 
            ViewState["dt"] = dt;
            dt = (DataTable)ViewState["dt"];
            radGridView2.DataSource = dt;      
    }

    private DataTable AddRow(DataTable dt)
    { // method to create row

            DataRow dr = dt.NewRow();
            dr[0] = sno.Text;
            dr[1] = type.Text;
            dr[2] = htitle.Text;
            dr[3] = disc.Text;
            dr[4] = job.SelectedItem.Text;
            dr[5] = drr.Text;
            dr[6] = crr.Text;
            dt.Rows.Add(dr);

        return dt;
    }  



    protected void b1_Click(object sender, EventArgs e)
    {
         DataTable dt = (DataTable)ViewState["dt"];       
        ViewState["dt"] = AddRow(dt);
        radGridView2.Rebind();
        Session["cttt"] = Convert.ToInt32(sno.Text)+1;
        sno.Text = Session["cttt"].ToString(); 
    }

【问题讨论】:

  • 你在哪一行得到空点异常
  • private DataTable AddRow(DataTable dt) { // 创建行的方法 DataRow dr = dt.NewRow();在这条线上兄弟
  • 不是 100% 确定 --- 但在 page_load 中写入 else of if(!IsPostBack){...} else {DataTable dt = (DataTable)ViewState["dt"];}
  • 仍然显示相同的异常。 :(

标签: c# asp.net gridview telerik


【解决方案1】:

我已经复制了您的代码并进行了一些更改。由于您的dt 声明了两次。我相信您的错误将是 DataTablenull

.aspx

<asp:ScriptManager ID="sm" runat="server"></asp:ScriptManager>
    <div>
        <telerik:RadGrid ID="rg" runat="server" OnNeedDataSource="RadGrid1_NeedDataSource"></telerik:RadGrid>
        <br />
        <asp:TextBox ID="sno" runat="server"></asp:TextBox><br />
        <asp:TextBox ID="type" runat="server" Text="A"></asp:TextBox><br />
        <asp:TextBox ID="htitle" runat="server" Text="B"></asp:TextBox><br />
        <asp:TextBox ID="disc" runat="server" Text="C"></asp:TextBox><br />
        <asp:DropDownList ID="job" runat="server"><asp:ListItem>Yeah</asp:ListItem></asp:DropDownList><br />
        <asp:TextBox ID="drr" runat="server" Text="D"></asp:TextBox><br />
        <asp:TextBox ID="crr" runat="server" Text="E"></asp:TextBox><br />
        <br />
        <br />
        <asp:Button ID="b1" runat="server" Text="Click" OnClick="b1_Click" />

    </div>
</asp:ScriptManager>

.cs

private DataTable dt;

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        sno.Text = "1";
    }
}

private DataTable CreateDataTable()
{
    dt = new DataTable();
    dt.Columns.Add("Sn#");
    dt.Columns.Add("type");
    dt.Columns.Add("AccountTitle");
    dt.Columns.Add("Description");
    dt.Columns.Add("CostCenter");
    dt.Columns.Add("Debit");
    dt.Columns.Add("Credit");

    return dt;
}

private DataTable AddRow(DataTable dt1)
{ // method to create row

    DataRow dr = dt1.NewRow();
    dr[0] = sno.Text;
    dr[1] = type.Text;
    dr[2] = htitle.Text;
    dr[3] = disc.Text;
    dr[4] = job.SelectedItem.Text;
    dr[5] = drr.Text;
    dr[6] = crr.Text;
    dt1.Rows.Add(dr);

    return dt1;
}  

protected void RadGrid1_NeedDataSource(object sender, Telerik.Web.UI.GridNeedDataSourceEventArgs e)
{
    rg.DataSource = ViewState["dt"] as DataTable;    
}

protected void b1_Click(object sender, EventArgs e)
{
    DataTable dt1 = ViewState["dt"] != null ? ViewState["dt"] as DataTable : CreateDataTable();
    ViewState["dt"] = AddRow(dt1);
    rg.Rebind();
    Session["cttt"] = Convert.ToInt32(sno.Text) + 1;
    sno.Text = Session["cttt"].ToString();
}

结果

【讨论】:

  • ViewState["dt"] = AddRow(dt);只是将这一行更改为 ViewState["dt"] = AddRow(dt1);在 b1_Click 中,它工作得很好
  • 非常喜欢 :) 你欠我的
  • stackoverflow.com/questions/32860285/…你能看看这个问题吗?
【解决方案2】:

您正在创建一个与事件 b1_click 中的全局变量 (dt) 同名的变量 - 这会导致混淆和错误。

protected void b1_Click(object sender, EventArgs e)
{
    //Use the global variable dt
    //DataTable dt = (DataTable)ViewState["dt"];       
    dt = (DataTable)ViewState["dt"];       
    ViewState["dt"] = AddRow(dt);
    radGridView2.Rebind();   //Note this would call the NeedDataSource event
    Session["cttt"] = Convert.ToInt32(sno.Text)+1;
    sno.Text = Session["cttt"].ToString(); 
}

这里要注意的另一点是 AddRow 方法将在按钮单击时被调用两次。一次来自 b1_click 事件,然后再次来自 NeedDataSource 事件(在 radGridView2.Rebind() 上触发)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 2019-06-08
    • 2013-07-28
    相关资源
    最近更新 更多