从代码背后填充gridview

时间:2014-07-18 16:03:35

标签: c# asp.net gridview webforms sqldatasource

我的ASP.NET网络表单中有一个gridview控件。我过去使用相同的代码在Windows窗体应用程序中使用数据填充gridview。

这是我的代码:

var sql = new SQL_Statements();
var stringSql = "select col1, col2, col3, col4 from table1 where col5=" + stringPO_NUM;
var sql_ds = sql.SelectFromDB(stringSql);
int DataIndex;
if (sql_ds.Tables["CurData"].Rows.Count > 0)
    for (DataIndex = 0; DataIndex <= sql_ds.Tables["CurData"].Rows.Count - 1; DataIndex++)
    {
        sql_ds.Tables["CurData"].Rows[DataIndex]["col4"].ToString();
        //Fill the datagridview with the data that was just pulled from SQL_Statements
        GV_POI.DataSource = sql_ds;
        GV_POI.DataMember = "CurData";
    }

以下是SelectFromDB的代码:

public DataSet SelectFromDB(String Sql)
        {
            var functionReturnValue = default(DataSet);
            var Class_Connection = new SQL_Connection();
            Class_Connection.cnn.Close(); //Let's close the connection, just in case it is open
            Class_Connection.cnn.Open();                
            var myDataAdaptor = new SqlDataAdapter(Sql, Class_Connection.cnn);
            var myDataset = new DataSet();

            try
            {
                myDataAdaptor.SelectCommand.Connection = Class_Connection.cnn;
                myDataAdaptor.SelectCommand.CommandText = Sql;
                myDataAdaptor.SelectCommand.CommandType = CommandType.Text;
                myDataAdaptor.Fill(myDataset, "CurData");
                functionReturnValue = myDataset;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                Class_Connection.cnn.Close();
            }
            return functionReturnValue;
            Class_Connection.cnn.Close();
        }

以下是ASPX页面中GridView的代码:

<asp:GridView ID="GV_POI" runat="server" AutoGenerateColumns="False">
                        </asp:GridView>

我不确定我做错了什么。页面加载时,gridview为空白。我检查了调试器中的代码,并且代码正在触发。有人可以告诉我我做错了吗?

8 个答案:

答案 0 :(得分:2)

如果要获取数据集中的所有数据&#34; sql_ds&#34;然后就不需要for循环了, 你可以这样做

GV_POI.DataSource = sql_ds.Tables[0];
GV_POI.DataBind();

并且还要使AutoGenerateColumns =&#34; True&#34;或使用 BoundField或TemplateField。

示例:

<asp:GridView ID="gvTest" runat="server" AutoGenerateColumns="False" GridLines="Vertical"
     OnRowEditing="gvTests_RowEditing"  AllowPaging="True" PageSize="20"
     OnRowDataBound="gvTest_RowDataBound">
<Columns>
<asp:BoundField HeaderText="ID" DataField="ID" ItemStyle-CssClass="hidecss" HeaderStyle-CssClass="hidecss" >
      <ItemStyle Width="80px" HorizontalAlign="Left" />
      <HeaderStyle Width="80px" Wrap="False" />
</asp:BoundField>                           
<asp:BoundField HeaderText="Name" DataField="Name">
      <ItemStyle Width="200px" HorizontalAlign="Left" />
      <HeaderStyle Width="200px" Wrap="False" />
</asp:BoundField>
<asp:BoundField HeaderText="Description" DataField="Description">
      <ItemStyle Width="200px" HorizontalAlign="Left" />
      <HeaderStyle Width="200px" Wrap="False" />
</asp:BoundField>                          
<asp:CommandField ShowEditButton="true" EditImageUrl="~/images/edit.png" ButtonType="Image">
      <HeaderStyle Width="20px" />
      <ItemStyle Width="20px" />
</asp:CommandField>
<asp:TemplateField>
    <ItemTemplate>
      <asp:ImageButton ID="btnDelete" runat="server" CommandName="Delete"
      ImageUrl="~/images/delete.png" AlternateText="Delete"
      ToolTip="Click to Delete"></asp:ImageButton>
    </ItemTemplate>
    </asp:TemplateField>
</Columns>
    <HeaderStyle CssClass="HeaderCss" />
    <PagerStyle CssClass="PagerCss" />                        
    <AlternatingRowStyle CssClass="AltRowCss" />
    <EditRowStyle CssClass="EditRowCss" />
</asp:GridView>

答案 1 :(得分:0)

好吧,我觉得你将GV_POI绑定到一个字符串

var stringSql = "select col1, col2, col3, col4 from table1 where col5=" + stringPO_NUM;
GV_POI.DataSource = stringSql;

不是实际的数据列表。

我想你想要

GV_POI.DataSource = sql_ds;

答案 2 :(得分:0)

我认为您需要执行以下操作,因为您当前正在设置数据库,因为您当前没有将数据绑定到数据网格:

string member;
member = "CurData";
GV_POI.SetDataBinding(sql_ds, member);

编辑 - 更新后:

如果您已设置&#39; AutoGenerateColumns&#39;到&#39;假&#39;那么你需要指定列。一个例子是:

<Columns>
    <asp:TemplateColumn>
        <HeaderTemplate>Job Number</HeaderTemplate>
        <ItemTemplate><%# Eval("Job Number") %></ItemTemplate>
    </asp:TemplateColumn>
</Columns>

显然你可能只想做一个“绑定”和“绑定”。或类似的东西。您还需要替换自己的标题数据等。您需要为要显示的每个列执行此操作。或者,只需设置&#39; AutoGenerateColumns&#39;到了&#39; true&#39;。

答案 3 :(得分:0)

您应该设置DataSource属性然后绑定它。可以在那里找到好的例子:http://msdn.microsoft.com/en-us/library/fkx0cy6d(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2

  DataSet ds = GetData(queryString);
  if (ds.Tables.Count > 0)
  {
    AuthorsGridView.DataSource = ds;
    AuthorsGridView.DataBind();
  }

答案 4 :(得分:0)

在循环结束时,不要忘记databind()

GV_POI.DataBind();

答案 5 :(得分:0)

如果您尝试将GV_POI.DataBind()附加到您的代码中,但这不起作用,那么我会查看触发您的代码执行的事件。是页面加载事件吗?还要检查是否有任何可能覆盖数据绑定事件的GV_POI事件?例如GV_POI_DataBoundGV_POI_RowDataBound

答案 6 :(得分:0)

你去吧:

    public DataTable SelectFromDB(String Sql)
    {

        var Class_Connection = new SQL_Connection();

        Class_Connection.cnn.Open();                
        var myDataAdaptor = new SqlDataAdapter(Sql, Class_Connection.cnn);
        var myDataTable = new DataTable();

        try
        {
            myDataAdaptor.SelectCommand.Connection = Class_Connection.cnn;
            myDataAdaptor.SelectCommand.CommandText = Sql;
            myDataAdaptor.SelectCommand.CommandType = CommandType.Text;
            myDataAdaptor.Fill(myDataTable);
            Class_Connection.cnn.Close(); 
            return myDataTable;
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
            Class_Connection.cnn.Close();
            return null;
        }
    }


var sql = new SQL_Statements();
var stringSql = "select col1, col2, col3, col4 from table1 where col5=" + stringPO_NUM;
var sql_ds = sql.SelectFromDB(stringSql);

GV_POI.DataSource = sql_ds;
GV_POI.DAtaBind();


<asp:GridView ID="GV_POI" runat="server" AutoGenerateColumns="False">
    <EmptyDataTemplate>No records registered</EmptyDataTemplate>
</asp:GridView>`

答案 7 :(得分:0)

试试这个

在DataTable中获取数据而不是

if (dt.Rows.Count > 0)
{
    grid.DataSource = dt;
    gridDataBind();
}