我有一个带有数据源的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(),每次进行更改时都分配数据源,但这些都没有帮助。
答案 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