如何将多个图像添加到 DataGridViewImageColoumn 并以 windows 形式向每个图像添加事件
How to add more than one image to DataGridViewImageColoumn and add event to each image in windows forms
我需要在 Data Grid View
的图片栏中添加多张图片 (three images
),但默认图片栏不允许我设置多张图片。我需要为每个图像附加一个单独的事件。
由于我是编程新手,请帮助我。谢谢!
这是我将图像列添加到 Data Grid View
并初始化 image coloumn
:
的代码
DataGridViewImageColumn dgColMemos = new DataGridViewImageColumn();
列初始化(我没有包括整个代码):
this.dgPartslist[sColName, iRowIndex].Value = (Image)Properties.Resources.Memo_Image;
在不允许存储很多项但提供 Tag
的地方存储数据的最灵活的解决方案是创建一个合适的 class:
class ImagesTag
{
public Image Img1 { get; set; }
public Image Img2 { get; set; }
public Image Img3 { get; set; }
public int CurrentImg { get; set; }
public ImagesTag(Image i1, Image i2, Image i3)
{ CurrentImg = 0; Img1 = i1; Img2 = i2; Img3 = i3; }
}
现在除了设置图像本身之外,您还可以为每个 ImageCell's Tag
添加一个实例;这里我设置了 3 行:
DataGridViewImageColumn dgColMemos = new DataGridViewImageColumn();
dataGridView1.Columns.Add(dgColMemos);
dataGridView1.RowCount = 3;
for (Int16 r = 0; r < dataGridView1.RowCount; r++)
{
ImagesTag I3 = new ImagesTag(imageList2.Images[r * 3],
imageList2.Images[r * 3 + 1], imageList2.Images[r * 3 + 2]);
dataGridView1[0, r].Value = I3.Img1;
dataGridView1[0, r].Tag = I3;
}
请注意,我不访问资源,而是访问 ImageList
用于我的测试。您的设置代码将大不相同!
我设置第一个 Image
来显示并将此索引也放在 class 中。这是因为如果不检查像素以找出当前显示的图像是很难甚至不可能的。
这是一个在 MouseClick
上旋转三个图像的示例:
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
ImagesTag I3 = (ImagesTag)(dataGridView1[e.ColumnIndex, e.RowIndex].Tag);
int current = (int)(I3.CurrentImg);
int next = ++current % 3;
dataGridView1[0, e.RowIndex].Value = next == 0 ? I3.Img1 : next == 1 ? I3.Img2 : I3.Img3;
I3.CurrentImg = next;
dataGridView1[0, e.RowIndex].Tag = I3;
}
当然,您可以根据自己的需要调整class的设计;您可以用 List<Image>
替换 3 个硬编码图像,您可以添加 events/delegates 以在单击其中一个时调用,添加文本以显示为工具提示等等..
我需要在 Data Grid View
的图片栏中添加多张图片 (three images
),但默认图片栏不允许我设置多张图片。我需要为每个图像附加一个单独的事件。
由于我是编程新手,请帮助我。谢谢!
这是我将图像列添加到 Data Grid View
并初始化 image coloumn
:
DataGridViewImageColumn dgColMemos = new DataGridViewImageColumn();
列初始化(我没有包括整个代码):
this.dgPartslist[sColName, iRowIndex].Value = (Image)Properties.Resources.Memo_Image;
在不允许存储很多项但提供 Tag
的地方存储数据的最灵活的解决方案是创建一个合适的 class:
class ImagesTag
{
public Image Img1 { get; set; }
public Image Img2 { get; set; }
public Image Img3 { get; set; }
public int CurrentImg { get; set; }
public ImagesTag(Image i1, Image i2, Image i3)
{ CurrentImg = 0; Img1 = i1; Img2 = i2; Img3 = i3; }
}
现在除了设置图像本身之外,您还可以为每个 ImageCell's Tag
添加一个实例;这里我设置了 3 行:
DataGridViewImageColumn dgColMemos = new DataGridViewImageColumn();
dataGridView1.Columns.Add(dgColMemos);
dataGridView1.RowCount = 3;
for (Int16 r = 0; r < dataGridView1.RowCount; r++)
{
ImagesTag I3 = new ImagesTag(imageList2.Images[r * 3],
imageList2.Images[r * 3 + 1], imageList2.Images[r * 3 + 2]);
dataGridView1[0, r].Value = I3.Img1;
dataGridView1[0, r].Tag = I3;
}
请注意,我不访问资源,而是访问 ImageList
用于我的测试。您的设置代码将大不相同!
我设置第一个 Image
来显示并将此索引也放在 class 中。这是因为如果不检查像素以找出当前显示的图像是很难甚至不可能的。
这是一个在 MouseClick
上旋转三个图像的示例:
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
ImagesTag I3 = (ImagesTag)(dataGridView1[e.ColumnIndex, e.RowIndex].Tag);
int current = (int)(I3.CurrentImg);
int next = ++current % 3;
dataGridView1[0, e.RowIndex].Value = next == 0 ? I3.Img1 : next == 1 ? I3.Img2 : I3.Img3;
I3.CurrentImg = next;
dataGridView1[0, e.RowIndex].Tag = I3;
}
当然,您可以根据自己的需要调整class的设计;您可以用 List<Image>
替换 3 个硬编码图像,您可以添加 events/delegates 以在单击其中一个时调用,添加文本以显示为工具提示等等..