如何使用 C# 在 gridview 中添加新行?

Posted

技术标签:

【中文标题】如何使用 C# 在 gridview 中添加新行?【英文标题】:how to add a new row in gridview using C#? 【发布时间】:2017-01-28 10:51:07 【问题描述】:

我想从数据库中检索数据,修改记录后我想在 Gridview 中显示它。

我已经通过Edit columns 创建了列名,这些名称是Date,Location,Job Title,Details

这是我的 asp.net 代码

<asp:GridView ID="GridViewRecord" runat="server" AutoGenerateColumns="False" CellPadding="4" ForeColor="#333333" GridLines="None">
                <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
                <Columns>
                    <asp:BoundField HeaderText="Date" />
                    <asp:BoundField HeaderText="Location" />
                    <asp:BoundField HeaderText="Job Title" />
                    <asp:BoundField HeaderText="Experience" />
                    <asp:HyperLinkField HeaderText="Details" />
                </Columns>
                <EditRowStyle BackColor="#999999" />
                <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
                <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
                <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
                <SortedAscendingCellStyle BackColor="#E9E7E2" />
                <SortedAscendingHeaderStyle BackColor="#506C8C" />
                <SortedDescendingCellStyle BackColor="#FFFDF8" />
                <SortedDescendingHeaderStyle BackColor="#6F8DAE" />
            </asp:GridView>

然后我尝试直接添加一个示例记录。但我收到一个错误。 这是我在页面加载时的 c# 代码

protected void Page_Load(object sender, EventArgs e)

    if (!this.IsPostBack)
    
        DataTable dt = new DataTable();

        DataRow dr = dt.NewRow();
        dr[0] = "12-12-12"; //Error message occured here
        dr[1] = "Jeddah";
        dr[2] = "Java";
        dr[3] = "2";
        dr[4] = "View Details";

        dt.Rows.Add(dr);
        GridViewRecord.DataSource = dt;
        GridViewRecord.DataBind();
    

错误信息:

System.Data.dll 中出现“System.IndexOutOfRangeException”类型的异常,但未在用户代码中处理 附加信息:找不到第 0 列。

我是 C# 新手,谢谢

【问题讨论】:

【参考方案1】:

您还没有向DataTable 添加任何列,这就是原因。

// Create a new DataTable object.
DataTable table = new DataTable();

// Declare a DataColumn
DataColumn column;

// Create the new DataColumn, set DataType, ColumnName and add then add to DataTable.    
column = new DataColumn();
column.DataType = System.Type.GetType("System.Int32");
column.ColumnName = "id";
table.Columns.Add(column);

// I think that the line-by-line explanation is better for the purpose of this answer
// you can of course do all of this in one row, assuming that you already have a datatable
table.Columns.Add("id", typeof(int));

但是,在您的示例中,您正在创建自己的DataTable,为什么不使用数据库中的那个?那将已经有与您的选择查询匹配的列。

// create DataSet
DataSet ds = new DataSet();

// your operations for filing the DataSet with data from the database which you have not shared
// ...
// ...

// check to see whether we have a DataTable in the DataSet (if the query fails, ds.Tables.Count == 0)
if (ds.Tables.Count > 0) 
   DataRow row = ds.Tables[0].NewRow();
   // add data according to the schema
   // e.g.
   row["id"] = "blah";
   // add the rest of the columns

   // and lastly add the newly created row to the DataTable;
   ds.Tables[0].Rows.Add(row);


// now bind
GridViewRecord.DataSource = ds.Tables[0];
GridViewRecord.DataBind();

【讨论】:

您可以将列的声明、构造函数调用和属性分配压缩成一行。 System.Type.GetType("System.Int32"); 应该避免使用 typeof 关键字。 @mason - msdn 不同意你的观点。我会和他们一起去。 msdn.microsoft.com/en-us/library/… 仅仅因为他们使用了那个并不意味着他们不同意我的观点。这只是意味着它是很久以前写的。 MSDN 文档充满了过时的编码实践。使用typeof 运算符不依赖于魔术字符串。 @mason - 你可能是对的。但是,我回答的目的是解释为什么您不能将有列的行添加到没有列的DataTable 是的,我明白目的。我只是认为,如果您只是简单地使用DataColumn column = new DataColumn("id", typeof(int)); 甚至table.Columns.Add("id", typeof(int));,它会更加简洁明了。这是您的答案。【参考方案2】:

您还可以使用通用列表或字符串列表,这将使您的代码更简单 而且性能方面DataTable 与列表相比也不好

例如:

List<string> lstRecord = new List<string>

    "12-12-12",
    "Jeddah",
    "Java",
    "2",
    "View Details"
;
GridViewRecord.DataSource = lstRecord;
GridViewRecord.DataBind();

【讨论】:

通过此代码,您要添加 5 行,但他想添加 1 行 5 列。【参考方案3】:
  if (!this.IsPostBack)
               DataTable dt = new DataTable();
                dt.Columns.Add("0");
                dt.Columns.Add("1");
                dt.Columns.Add("2");
                dt.Columns.Add("3");
                dt.Columns.Add("4");

                DataRow dr = dt.NewRow();
                dr[0] = "12-12-12"; //Error message occured here
                dr[1] = "Jeddah";
                dr[2] = "Java";
                dr[3] = "2";
                dr[4] = "View Details";

                dt.Rows.Add(dr);
                GridViewRecord.DataSource = dt;
                GridViewRecord.DataBind();
            

您需要添加到 DataTable 列才能使用它 (0,1,2,3,4) 对应表数组,就像您编写 dr[0]= Add("0");

或者您可以轻松管理要插入日期的列,您可以这样做

dr["2"]= "Java";  

【讨论】:

您的代码不起作用。以及它没有显示错误。

以上是关于如何使用 C# 在 gridview 中添加新行?的主要内容,如果未能解决你的问题,请参考以下文章

绑定 C#、ASP.net 后在 gridview 中添加新行

如何从数据库中选择数据并将其显示在gridview的新行上

在 jquery 模式对话框中使用 asp:gridview 和添加新行按钮

如何使用 C# asp.net 在 GridView 中添加文件上传日期和/或时间?

GridView Tab/Enter键插入新行

在gridview中插入多行