DataGridView只显示1行

时间:2012-03-14 16:09:27

标签: c# datagridview datasource

我有一个带有数据源的DatagridView,但我的datagridview只绘制了一行。

我的代码是这样的:

列表声明

List<Texture> LoadedTextures = new List<Texture>();

Custum数据源对象

public class Texture
{
    public Image Image { get; set; }
    public string Name { get; set; }
}

添加方法

private void LoadImage(string FileName)
{
    FileInfo file = new FileInfo(FileName);

    if (LoadedTextures.Count > 0 && 
       LoadedTextures.Where(x => x.Name == file.Name).Count() > 0)
    {
        MessageBox.Show("Already a texture with that name", "error",
           MessageBoxButtons.OK, MessageBoxIcon.Error);
        return;
    }
    Bitmap newImage = new Bitmap(CurrLevel.TileWidth, CurrLevel.TileHeight);
    using (Graphics gr = Graphics.FromImage(newImage))
    {
        gr.SmoothingMode = SmoothingMode.AntiAlias;
        gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
        gr.PixelOffsetMode = PixelOffsetMode.HighQuality;
        gr.DrawImage(Image.FromFile(FileName), 
           new Rectangle(0, 0, CurrLevel.TileWidth, CurrLevel.TileWidth));
    }
    var text = new Texture
    {
        Image = (Image)newImage,
        Name = file.Name
    };
    LoadedTextures.Add(text);
    if(Tiles.DataSource == null)Tiles.DataSource = LoadedTextures;  
}

调试时我还注意到我的Datasource包含已加载的元素,但datagridview只绘制了1行。

P.S:我试过,DataGridView.Refresh(),DataGridView.RefreshEdit(),每次进行更改时都分配数据源,但这些都没有帮助。

3 个答案:

答案 0 :(得分:1)

使用绑定列表为我工作(使用更改事件刷新列表), Tnx用于所有回复。

答案 1 :(得分:0)

假设这是一个网络应用程序,我尝试了以下内容以确认我的怀疑之一:

List<int> myList = new List<int>();
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            for (int i = 0; i < 10; i++)
                myList.Add(i);
        }
    }

    protected void btn_AddItem_Click(object sender, EventArgs e)
    {
        myList.Add(10);
        Console.Write(myList.Count()); //always prints "1"
    }

该列表丢失了我猜测正在发生的所有项目。至于如何修复它,我不是积极的,但至少它缩小了问题的根源。

如果它不是网络应用程序,那么我很抱歉,因为我不熟悉其他类型的应用程序的生命周期。

答案 2 :(得分:0)

我认为你检查数据源是否为空可能是问题所在:

if(Tiles.DataSource == null) Tiles.DataSource = LoadedTextures;

只需删除检查并直接分配,因为第一次添加一个Texture时,它会将其更改为非null,然后它将永远不会再次更新DataSource,无论你多少多少添加:

Tiles.DataSource = LoadedTextures

如果您加载多个Textures,最好全部加载Tiles.DataSource = LoadedTextures,而不是每次加载新的Texture