0

我在一个单独的类中有一个方法,它返回一个 GridView 但由于某种原因它不会显示数据。经过进一步调查,我发现 Gridview 已经分配了正确的数据但不显示它!如果我在主类中运行代码,它工作正常!请帮忙!

//黑胶类

public GridView SearchByAlbum(string AlbumName)
{
    VinylComm.CommandType = CommandType.StoredProcedure;
    VinylComm.CommandText = "AlbumVinylSearch";

    SqlParameter VinylAlbumName;
    VinylAlbumName = new SqlParameter();
    VinylAlbumName.ParameterName = "@AlbumName";
    VinylAlbumName.SqlDbType = SqlDbType.VarChar;
    VinylAlbumName.SqlValue = AlbumName;
    VinylAlbumName.Size = 50;
    VinylAlbumName.Direction = ParameterDirection.Input;

    VinylComm.Parameters.Add(VinylAlbumName);

    GridView gv;
    gv = new GridView();

    VinylConn.Open();
    gv.DataSource = VinylComm.ExecuteReader();
    gv.DataBind();
    VinylConn.Close();

    return gv;
}

//主页

protected void Submit_Click(object sender, EventArgs e)
{
    Vinyl v;
    v = new Vinyl();
    switch (SearchOptions.SelectedIndex)
    {
        case 0:
            GridView1 = v.SearchByAlbum(SearchInput.Text);
            break;
        default:
            break;
    }
}

}

4

2 回答 2

3

Gridview 知道它有数据但不想显示它

淘气GridView。而不是创建动态GridViews并将引用分配给页面中已经存在的另一个 GridView,您应该简单地返回DataSource. 这甚至都行不通,如果您想在其他地方获得该数据,它也更可重用。

switch (SearchOptions.SelectedIndex)
{
    case 0:
        GridView1.DataSource = v.SearchByAlbum(SearchInput.Text);
        break;
    default:
        break;
}
GridView1.DataBind();

以及加载和返回数据的方法:

public IDataSource SearchByAlbum(string AlbumName)
{
    // ...
}
于 2013-01-20T01:08:52.823 回答
0

为了扩展先前的答案,我完全同意您应该将数据源从您的 Vinyl 类传递给您的 DataSource:

GridView1.DataSource = v.SearchByAlbum(SearchInput.Text);

但是,我建议从您的 SearchByAlbum 过程中返回一个List<yourObject>或。IEnumerable我认为您的 DAL 和您的 UI 应该相互独立。这就是引入模型(或 DTO)可以帮助减轻未来变化带来的痛苦的地方。

像这样的东西:

public class yourobject {
   int id { get; set; }
   string anyotherprop { get; set; }
}

然后在你的 Vinyl 类中(只是从上面复制,但有些可以合并——你应该使用 using 例如,但这是另一个主题):

public List<yourobject> SearchByAlbum(string AlbumName)
{
    List<yourobject> yourobjects = new List<yourobject>();

    VinylComm.CommandType = CommandType.StoredProcedure;
    VinylComm.CommandText = "AlbumVinylSearch";

    SqlParameter VinylAlbumName;
    VinylAlbumName = new SqlParameter();
    VinylAlbumName.ParameterName = "@AlbumName";
    VinylAlbumName.SqlDbType = SqlDbType.VarChar;
    VinylAlbumName.SqlValue = AlbumName;
    VinylAlbumName.Size = 50;
    VinylAlbumName.Direction = ParameterDirection.Input;

    VinylComm.Parameters.Add(VinylAlbumName);

    VinylConn.Open();

    SqlDataReader reader = VinylComm.ExecuteReader();
    while (reader.Read())
    {
        yourobjects.Add(new yourobject() { 
           //Fill values
        });
    }
    VinylConn.Close();

    return yourobjects;
}

此外,如果在其他 Gridview 程序(RowDataBound、RowCommand 等)中使用,我认为您会发现投射对象也更容易。

祝你好运。

于 2013-01-20T01:36:54.060 回答