【问题标题】:edit row in gridview在gridview中编辑行
【发布时间】:2011-11-24 05:52:39
【问题描述】:

我想帮助我编写代码。我有 2 个网格视图。在第一个 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>

【问题讨论】:

  • @adatapost,寻求帮助永远不会丢脸。这家伙没有要求任何人做他的功课。他正在逐步学习如何使用gridviews。在可以提供一些鼓励的同时,不要对人苛刻。
  • @deadlock - 如果他/她真的愿意加入讨论,我不反对做作业。粘贴未格式化的代码/文本将不符合问答的目的。
  • 现在,我看到了你的 cmets。最后我找到了解决方案。当然,我不想做作业。只是为了帮助我。

标签: c# asp.net


【解决方案1】:

这不是特定的 asp.net 解决方案,但这就是我在 Windows 应用程序中执行此类操作的方式。

首先,您应该确保 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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    相关资源
    最近更新 更多