2014-09-30 45 views
0

我点击一个按钮,将网格上的选定数据复制到另一个上。我正在使用postgre SQl进行应用程序。这里是HTML的链接。我作为绑定gridview在进程中抛出一个错误?

NpgsqlDataAdapter adp; 
    NpgsqlConnection conn = new NpgsqlConnection(ConfigurationManager.ConnectionStrings["projop"].ConnectionString); 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      BindPrimaryGrid(); 
      BindSecondaryGrid(); 
     } 
    } 

    private void BindSecondaryGrid() 
    { 
     DataTable dt = (DataTable)ViewState["SelectedRecords"]; 
     gvSelected.DataSource = dt; 
     gvSelected.DataBind(); 
    } 
    private void BindPrimaryGrid() 
    { 
     DataTable dt = new DataTable(); 
     adp = new NpgsqlDataAdapter("select user_id, username,screen_name from users", conn); 
     dt = new DataTable("users"); 
     adp.Fill(dt); 
     gvAll.DataSource = dt; 
     gvAll.DataBind(); 

结合数据的数据&点击按钮的选择后作为

protected void btnSubmit_Click(object sender, EventArgs e) 
    { 
     GetData(); 
     SetData(); 
     BindSecondaryGrid(); 
    } 
private void GetData() 
    { 
     DataTable dt; 
     if (ViewState["SelectedRecords"] != null) 
      dt = (DataTable)ViewState["SelectedRecords"]; 
     else 
      dt = CreateDataTable(); 
     CheckBox chkAll = (CheckBox)gvAll.HeaderRow 
          .Cells[0].FindControl("chkAll"); 
     for (int i = 0; i < gvAll.Rows.Count; i++) 
     { 
      if (chkAll.Checked) 
      { 
       dt = AddRow(gvAll.Rows[i], dt); 
      } 
      else 
      { 
       CheckBox chk = (CheckBox)gvAll.Rows[i] 
           .Cells[0].FindControl("chk"); 
       if (chk.Checked) 
       { 
        dt = AddRow(gvAll.Rows[i], dt); 
       } 
       else 
       { 
        dt = RemoveRow(gvAll.Rows[i], dt); 
       } 
      } 
     } 
     ViewState["SelectedRecords"] = dt; 
    } 

    private void SetData() 
    { 
     CheckBox chkAll = (CheckBox)gvAll.HeaderRow.Cells[0].FindControl("chkAll"); 
     chkAll.Checked = true; 
     if (ViewState["SelectedRecords"] != null) 
     { 
      DataTable dt = (DataTable)ViewState["SelectedRecords"]; 
      for (int i = 0; i < gvAll.Rows.Count; i++) 
      { 
       CheckBox chk = (CheckBox)gvAll.Rows[i].Cells[0].FindControl("chk"); 
       if (chk != null) 
       { 
        DataRow[] dr = dt.Select("CustomerID = '" + gvAll.Rows[i].Cells[1].Text + "'"); 
        chk.Checked = dr.Length > 0; 
        if (!chk.Checked) 
        { 
         chkAll.Checked = false; 
        } 
       } 
      } 
     } 
    } 

这里,而在功能btnSubmit_Click通过BindSecondaryGrid()在功能BindSecondaryGrid()结合数据上gvSelected.DataBind();显示错误。

错误:DataBinding: 'HttpException - System.Data.DataRowView' does not contain a property with the name 'user_id'.

编辑:添加删除&代码

private DataTable AddRow(GridViewRow gvRow, DataTable dt) 
    { 
     DataRow[] dr = dt.Select("CustomerID = '" + gvRow.Cells[1].Text + "'"); 
     if (dr.Length <= 0) 
     { 
      dt.Rows.Add(); 
      dt.Rows[dt.Rows.Count - 1]["CustomerID"] = gvRow.Cells[1].Text; 
      dt.Rows[dt.Rows.Count - 1]["ContactName"] = gvRow.Cells[2].Text; 
      dt.Rows[dt.Rows.Count - 1]["Complete Name"] = gvRow.Cells[3].Text; 
      dt.AcceptChanges(); 
     } 
     return dt; 
    } 

    private DataTable RemoveRow(GridViewRow gvRow, DataTable dt) 
    { 
     DataRow[] dr = dt.Select("CustomerID = '" + gvRow.Cells[1].Text + "'"); 
     if (dr.Length > 0) 
     { 
      dt.Rows.Remove(dr[0]); 
      dt.AcceptChanges(); 
     } 
     return dt; 
    } 
+1

请发布您的AddRow或RemoveRow功能代码。谢谢 – Hatjhie 2014-09-30 07:11:17

+0

@Hatjhie我添加了添加/删除代码。请检查。 – jhonnash 2014-09-30 07:18:56

回答

0

你可以共享网格视图控制你的aspx一部分?

您可以在调试模式下看到数据表数据。检查您是否能够查看您用于绑定第二个网格的视图状态的所有列和数据。通过执行上述步骤,您应该能够轻松识别问题。

+1

这应该是一个评论 – Sam 2014-09-30 07:17:45

+0

@Krishan:我已经分享了完整的HTML给定的问题上面的链接。 – jhonnash 2014-09-30 07:41:36

1

这是因为您的GridView中指定的DataField不正确。让我们试试这个。

<asp:BoundField DataField = "CustomerID" HeaderText = "Customer ID" 
HtmlEncode = "false" /> 
<asp:BoundField DataField = "ContactName" HeaderText = "Contact Name" 
HtmlEncode = "false" /> 
<asp:BoundField DataField = "CompleteName" HeaderText = "Complete Name" 
HtmlEncode = "false" /> 

请注意,指定的DataField必须与DataRow的名称匹配。

我假设你的表具有列强调了与**:

dt.Rows[dt.Rows.Count - 1]["**CustomerID**"] = gvRow.Cells[1].Text; 
dt.Rows[dt.Rows.Count - 1]["**ContactName**"] = gvRow.Cells[2].Text; 
dt.Rows[dt.Rows.Count - 1]["**CompleteName**"] = gvRow.Cells[3].Text; 

让我知道这是否修复了这个问题。谢谢