2011-01-18 4 views
0

내 코드를 도와주고 싶습니다. 나는 2 gridviews 있습니다. 첫 번째 gridview에서 사용자는 그가 원하는 모든 행의 확인란을 선택할 수 있습니다. 이 행은 두 번째 gridview에서 전송됩니다. 이 모든 코드는 잘 처리합니다. 이제, 두 번째 gridview의 수량 열을 편집하여 값을 변경하려고하지만 편집 상자에 무엇을 써야하는지 모릅니다. 다음은 내 코드입니다 :gridview에서 행 편집

using System; 
using System.Data; 
using System.Data.SqlClient; 
using System.Configuration; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Web.UI.HtmlControls; 
using System.Collections; 

public partial class ShowLand : System.Web.UI.Page 
{ 

    protected void Page_Load(object sender, EventArgs e) 
    { 


     if (!IsPostBack) 
     { 
      BindPrimaryGrid(); 
      BindSecondaryGrid(); 

     } 
    } 
    private void BindPrimaryGrid() 
    { 
     string constr = ConfigurationManager.ConnectionStrings["conString"].ConnectionString; 
     string query = "select * from Land"; 
     SqlConnection con = new SqlConnection(constr); 
     SqlDataAdapter sda = new SqlDataAdapter(query, con); 
     DataTable dt = new DataTable(); 
     sda.Fill(dt); 
     gridview2.DataSource = dt; 
     gridview2.DataBind(); 
    } 



    private void GetData() 
    { 
     DataTable dt; 
     if (ViewState["SelectedRecords1"] != null) 
      dt = (DataTable)ViewState["SelectedRecords1"]; 
     else 
      dt = CreateDataTable(); 
     CheckBox chkAll = (CheckBox)gridview2.HeaderRow 
          .Cells[0].FindControl("chkAll"); 
     for (int i = 0; i < gridview2.Rows.Count; i++) 
     { 
      if (chkAll.Checked) 
      { 
       dt = AddRow(gridview2.Rows[i], dt); 
      } 
      else 
      { 
       CheckBox chk = (CheckBox)gridview2.Rows[i] 
           .Cells[0].FindControl("chk"); 
       if (chk.Checked) 
       { 
        dt = AddRow(gridview2.Rows[i], dt); 
       } 
       else 
       { 
        dt = RemoveRow(gridview2.Rows[i], dt); 
       } 
      } 
     } 
     ViewState["SelectedRecords1"] = dt; 
    } 
    private void SetData() 
    { 
     CheckBox chkAll = (CheckBox)gridview2.HeaderRow.Cells[0].FindControl("chkAll"); 
     chkAll.Checked = true; 
     if (ViewState["SelectedRecords1"] != null) 
     { 
      DataTable dt = (DataTable)ViewState["SelectedRecords1"]; 
      for (int i = 0; i < gridview2.Rows.Count; i++) 
      { 
       CheckBox chk = (CheckBox)gridview2.Rows[i].Cells[0].FindControl("chk"); 
       if (chk != null) 
       { 
        DataRow[] dr = dt.Select("id = '" + gridview2.Rows[i].Cells[1].Text + "'"); 
        chk.Checked = dr.Length > 0; 
        if (!chk.Checked) 
        { 
         chkAll.Checked = false; 
        } 
       } 
      } 
     } 
    } 
      private DataTable CreateDataTable() 
       { 
        DataTable dt = new DataTable(); 
        dt.Columns.Add("id"); 
        dt.Columns.Add("name"); 
        dt.Columns.Add("price"); 
        dt.Columns.Add("quantity"); 
        dt.Columns.Add("total"); 
        dt.AcceptChanges(); 
        return dt; 
       } 
    private DataTable AddRow(GridViewRow gvRow, DataTable dt) 
    { 
    DataRow[] dr = dt.Select("id = '" + gvRow.Cells[1].Text + "'"); 
    if (dr.Length <= 0) 
    { 
     dt.Rows.Add(); 
     dt.Rows[dt.Rows.Count - 1]["id"] = gvRow.Cells[1].Text; 
     dt.Rows[dt.Rows.Count - 1]["name"] = gvRow.Cells[2].Text; 
     dt.Rows[dt.Rows.Count - 1]["price"] = gvRow.Cells[3].Text; 
     dt.Rows[dt.Rows.Count - 1]["quantity"] = gvRow.Cells[4].Text; 
     dt.Rows[dt.Rows.Count - 1]["total"] = gvRow.Cells[5].Text; 
     dt.AcceptChanges(); 
    } 
    return dt; 
    } 

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

    protected void CheckBox_CheckChanged(object sender, EventArgs e) 
    { 
    GetData(); 
    SetData(); 
    BindSecondaryGrid(); 
    } 

    private void BindSecondaryGrid() 
    { 
    DataTable dt = (DataTable)ViewState["SelectedRecords1"]; 
    gridview3.DataSource = dt; 
    gridview3.DataBind(); 
    } 
    } 

소스 코드는

<asp:GridView ID="gridview2" runat="server" AutoGenerateColumns="False" 
DataKeyNames="id" DataSourceID="SqlDataSource5"> 
<Columns> 
    <asp:TemplateField> 
    <HeaderTemplate> 
    <asp:CheckBox ID="chkAll" runat="server" onclick = "checkAll(this);" 
        AutoPostBack = "true" OnCheckedChanged = "CheckBox_CheckChanged"/> 
    </HeaderTemplate> 
    <ItemTemplate> 
     <asp:CheckBox ID="chk" runat="server" onclick = "Check_Click(this)" 
       AutoPostBack = "true" OnCheckedChanged = "CheckBox_CheckChanged" /> 
    </ItemTemplate> 
    </asp:TemplateField> 

    <asp:BoundField DataField="id" HeaderText="id" InsertVisible="False" 
      ReadOnly="True" SortExpression="id" /> 

    <asp:BoundField DataField="name" HeaderText="name" 
      SortExpression="name" /> 

    <asp:BoundField DataField="price" HeaderText="price" SortExpression="price" /> 

    <asp:BoundField DataField="quantity" HeaderText="quantity" 
      SortExpression="quantity" /> 

    <asp:BoundField DataField="total" HeaderText="total" SortExpression="total" /> 
</Columns> 
</asp:GridView> 

<asp:SqlDataSource ID="SqlDataSource5" runat="server" 
    ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 
    SelectCommand="SELECT * FROM [Land]"></asp:SqlDataSource> 
    <br /> 
    </div> 
<div> 

<asp:GridView ID="gridview3" runat="server" 
    AutoGenerateColumns = "False" DataKeyNames="id" 
    EmptyDataText = "No Records Selected" > 
<Columns> 
    <asp:BoundField DataField = "id" HeaderText = "id" /> 
    <asp:BoundField DataField = "name" HeaderText = "name" ReadOnly="True" /> 
    <asp:BoundField DataField = "price" HeaderText = "price" 
     DataFormatString="{0:c}" ReadOnly="True" /> 
    <asp:TemplateField HeaderText="quantity"> 
    <EditItemTemplate> 
    <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("quantity")%>'</asp:TextBox> 
    </EditItemTemplate> 
    <ItemTemplate> 
    <asp:Label ID="Label1" runat="server" Text='<%# Bind("quantity") %>'></asp:Label> 
    </ItemTemplate> 
    </asp:TemplateField> 
    <asp:BoundField DataField = "total" HeaderText = "total" 
      DataFormatString="{0:c}" ReadOnly="True" /> 
      <asp:CommandField ShowEditButton="True" /> 

</Columns> 
</asp:GridView> 

<asp:Label ID="totalLabel" runat="server"></asp:Label> 
<br /> 

    </div> 
    </form> 
    </body> 
</html> 
+0

@adatapost, 도움을 요청하는 것은 부끄러운 일이 아닙니다. 그 남자는 아무에게도 숙제를 요구하지 않았다. 그는 gridviews를 단계적으로 사용하는 방법을 배우고 있습니다. 격려를하는 동안 사람들에게 가혹하지 마십시오. – deadlock

+0

@deadlock - 나는 그/그녀가 토론에 정말로 참여하고 싶다면 숙제를 반대하지 않습니다. 포맷되지 않은 코드/텍스트를 붙여 넣는 것은 Q & A의 목적을위한 것이 아닙니다. – adatapost

+0

지금 귀하의 의견을 참조하십시오. 마지막으로 해결책을 찾았습니다. 그리고 물론 나는 그랬다. 숙제를하고 싶지 않다. 나를 도우려고. – dali1985

답변

2

이 특히 asp.net의 해결책이 아니다하지만 난 내 윈도우 응용 프로그램에서 같은 것을 할 방법 그건.

먼저 GridView (gridView.SelectedRow != null)에 선택된 행이 있음을 확인하십시오. DataTable 개체를 사용하면 숫자 인덱스가 아닌 DataRow -type 개체 인덱스로 액세스하여 원하는 행에 액세스 할 수 있습니다. 수정하려는 필드 값의 행에 대한 참조를 얻은 후에 변경 사항을 진행하십시오.

if (gridView.SelectedRow != null) 
{ 
    dataTable.Rows[gridView.SelectedRow].BeginEdit(); 
    dataTable.Rows[gridView.SelectedRow]["yourFieldName"] = newValue; 
    dataTable.Rows[gridView.SelectedRow].EndEdit(); 
    gridView.DataSource = dataTable; 
} 

내가 전에 asp.net 처리 적이 있기 때문에 내 대답은 도움의 희망은 :

다음은 예입니다.

관련 문제