DataGridView仅1显示1行

本文关键字:1行 显示 DataGridView | 更新日期: 2023-09-27 18:27:52

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

我的代码是这样的:

名单申报

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

客户数据源对象

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;  
}

在调试时,我还注意到我的数据源包含加载的元素,但datagridview只绘制1行。

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

DataGridView仅1显示1行

使用绑定列表对我有效(使用更改事件刷新列表),所有响应的Tnx。

假设这是一个网络应用程序,我尝试了以下方法来证实我的一个怀疑:

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"
    }

这个列表丢失了所有的项目,我猜这就是发生在你身上的事情。至于如何解决,我不确定,但至少它缩小了你问题的根源。

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

我认为您检查DataSource是否为null可能是问题所在:

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

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

Tiles.DataSource = LoadedTextures

如果您加载多个Textures,最好将它们全部加载,然后调用Tiles.DataSource = LoadedTextures一次,而不是每次加载新的Texture