Contrôle C# Winform DataGridView et DataTable

Table des matières

I. Aperçu

Deuxièmement, l'utilisation de DataTable

1. Créer des tableaux et des colonnes

2. Ajouter une ligne

3. Valeur et affectation

4. Supprimer la ligne

5. Parcourez le DataTable

6. Déterminer si une valeur existe dans la colonne DataTable

7. Définir la clé primaire

8. Obtenez le numéro de ligne où se trouve le DataRow

9. Convertir DataTable en liste

10. Convertir la liste en DataTable

3. Utilisation de DataGridView

1. Données contraignantes

2. Obtenir la source de données liée

3. Obtenir/définir les données de la cellule sélectionnée

4. Définissez la largeur et la hauteur de la cellule

Finir


I. Aperçu

Le contrôle DataGridView fournit un tableau personnalisable pour afficher les données. La classe DataGridView permet la personnalisation des bordures de cellule, de ligne, de colonne et de GridColor à l'aide de propriétés telles que DefaultCellStyle, ColumnHeaders, DefaultCellStyle et CellBorderStyle. Pour plus d'informations, consultez Mise en forme et style de base dans le contrôle Microsoft DataGridView.

Les données peuvent être affichées avec ou sans source de données sous-jacente à l'aide du contrôle DataGridView. Si vous ne spécifiez pas de source de données, vous pouvez créer des colonnes et des lignes contenant des données et les ajouter directement au DataGridView à l'aide des propriétés Rows et Columns. Vous pouvez également utiliser la collection Rows pour accéder à l'objet DataGridViewRow et à la propriété DataGridViewRow.Cells pour lire ou écrire directement les valeurs des cellules. Indexer Item[] fournit également un accès direct aux cellules.

Au lieu de remplir manuellement le contrôle, vous pouvez définir la propriété DataSource DataMember pour qu'elle se lie à la source de données DataGridView et remplisse les données automatiquement. Pour plus d'informations, consultez Affichage des données dans le contrôle Microsoft DataGridView.

Lorsque vous traitez de grandes quantités de données, la propriété peut être définie sur VirtualModetrue pour afficher un sous-ensemble des données disponibles. Le mode virtuel nécessite l'implémentation d'un cache de données dans lequel remplir le contrôle DataGridView. 

Deuxièmement, l'utilisation de DataTable

1. Créer des tableaux et des colonnes

Utilisez new DataTable() pour créer une table DataTable, la table peut être créée avec ou sans le nom de la table

DataTable dt = new DataTable();
DataTable dt1 = new DataTable("Datas");

Le tableau DataTable est le même que notre Excel couramment utilisé, comme le montre la figure ci-dessous, les colonnes sont A, B, C, D... et les lignes sont 1, 2, 3, 4..... 

C'est juste qu'une fois le DataTable créé, il est vide et il n'y a ni colonnes créées automatiquement ni lignes créées automatiquement.Ceux-ci sont tous implémentés par nous via le code.

Créez une colonne en instanciant la classe DataColumn et en ajoutant la classe DataColumn à DataTable.Columns pour ajouter une colonne.

DataTable dt = new DataTable("Datas");
DataColumn dc1 = new DataColumn("商品编号");
DataColumn dc2 = new DataColumn("商品名称");
DataColumn dc3 = new DataColumn("商品重量");
DataColumn dc4 = new DataColumn("商品价格");
DataColumn dc5 = new DataColumn("购买数量");
dt.Columns.Add(dc1);
dt.Columns.Add(dc2);
dt.Columns.Add(dc3);
dt.Columns.Add(dc4);
dt.Columns.Add(dc5);

Lors de l'ajout d'une colonne, vous pouvez ajouter certains paramètres à la colonne

DataTable dt = new DataTable("Datas");
DataColumn dc1 = new DataColumn("商品编号");
DataColumn dc2 = new DataColumn("商品名称");
DataColumn dc3 = new DataColumn("商品重量");
DataColumn dc4 = new DataColumn("商品价格");
DataColumn dc5 = new DataColumn("购买数量");

dc1.AutoIncrement = true;//自动增加
dc1.AutoIncrementSeed = 1;//起始为1
dc1.AutoIncrementStep = 1;//步长为1
dc1.AllowDBNull = false;//是否允许空值
			
dt.Columns.Add(dc1);
dt.Columns.Add(dc2);
dt.Columns.Add(dc3);
dt.Columns.Add(dc4);
dt.Columns.Add(dc5);

C'est juste que c'est lourd à faire, donc ce n'est pas recommandé.

Il est recommandé d'ajouter des colonnes de la manière suivante

DataTable dt = new DataTable("Datas");
DataColumn dc = new DataColumn();
dc.AutoIncrement = true;//自动增加
dc.AutoIncrementSeed = 1;//起始为1
dc.AutoIncrementStep = 1;//步长为1
dc.AllowDBNull = false;//是否允许空值

//添加列
dt.Columns.Add("姓名", typeof(string));
dt.Columns.Add("年龄", typeof(int));
dt.Columns.Add("身高", typeof(float));
dt.Columns.Add("体重", typeof(float));

dataGridView1.DataSource = dt;

Effet de course dans Winform

Pour le moment, la ligne du tableau ne contient pas encore de données, voyons comment ajouter des données de ligne 

2. Ajouter une ligne

Les lignes sont ajoutées en ajoutant la classe DataRow, comme suit :

DataTable dt = new DataTable("Datas");
DataColumn dc = new DataColumn();
dc.AutoIncrement = true;//自动增加
dc.AutoIncrementSeed = 1;//起始为1
dc.AutoIncrementStep = 1;//步长为1
dc.AllowDBNull = false;//是否允许空值

//添加列
dt.Columns.Add("姓名", typeof(string));
dt.Columns.Add("年龄", typeof(int));
dt.Columns.Add("身高", typeof(float));
dt.Columns.Add("体重", typeof(float));

//添加行
DataRow newRow = dt.NewRow();
newRow["姓名"] = "1号";
newRow["年龄"] = "17";
newRow["身高"] = "155";
newRow["体重"] = "220";
dt.Rows.Add(newRow);

dataGridView1.DataSource = dt;

courir:

Bien qu'il soit possible d'ajouter des lignes de cette manière, c'est très lourd à utiliser, et bien sûr il existe une manière concise d'écrire

DataTable dt = new DataTable("Datas");
DataColumn dc = new DataColumn();
dc.AutoIncrement = true;//自动增加
dc.AutoIncrementSeed = 1;//起始为1
dc.AutoIncrementStep = 1;//步长为1
dc.AllowDBNull = false;//是否允许空值

//添加列
dt.Columns.Add("姓名", typeof(string));
dt.Columns.Add("年龄", typeof(int));
dt.Columns.Add("身高", typeof(float));
dt.Columns.Add("体重", typeof(float));

//添加行
dt.Rows.Add("2号", 12, 220, 300);

dataGridView1.DataSource = dt;

courir:

La manière d'ajouter des lignes ici peut également être remplacée par la manière d'écrire suivante, l'effet est le même

dt.Rows.Add(new object[] { "2号", 12, 220, 300 });

 

3. Valeur et affectation

Avant d'obtenir et de définir ces données, ajoutez des données

DataTable dt = new DataTable("Datas");
DataColumn dc = new DataColumn();
dc.AutoIncrement = true;//自动增加
dc.AutoIncrementSeed = 1;//起始为1
dc.AutoIncrementStep = 1;//步长为1
dc.AllowDBNull = false;//是否允许空值

//添加列
dc = dt.Columns.Add("姓名", typeof(string));
dc = dt.Columns.Add("年龄", typeof(int));
dc = dt.Columns.Add("身高", typeof(float));
dc = dt.Columns.Add("体重", typeof(float));

//添加行
dt.Rows.Add("1号", 17, 155, 220);
dt.Rows.Add("2号", 12, 220, 300);
dt.Rows.Add("3号", 45, 170, 132);

dataGridView1.DataSource = dt;

courir:

 

1) affectation

Affectation par numéro d'index

DataTable dt = new DataTable("Datas");
DataColumn dc = new DataColumn();
dc.AutoIncrement = true;//自动增加
dc.AutoIncrementSeed = 1;//起始为1
dc.AutoIncrementStep = 1;//步长为1
dc.AllowDBNull = false;//是否允许空值

//添加列
dt.Columns.Add("姓名", typeof(string));
dt.Columns.Add("年龄", typeof(int));
dt.Columns.Add("身高", typeof(float));
dt.Columns.Add("体重", typeof(float));

//添加行
dt.Rows.Add("1号", 17, 155, 220);
dt.Rows.Add("2号", 12, 220, 300);
dt.Rows.Add("3号", 45, 170, 132);

dataGridView1.DataSource = dt;

//1)赋值
dt.Rows[0][0] = "张三";

courir:

Notez qu'ici, dt.Rows[0] fait référence à quelle ligne et le second 0 à quelle colonne. Si dt.Rows[0] est remplacé par dt.Rows[1], l'effet est le suivant :

 

Affectation par nom de colonne

La définition du numéro de ligne dans dt.Rows[0] ne peut être définie que par des nombres, mais les colonnes suivantes peuvent être obtenues par des noms de colonne

dt.Rows[0]["姓名"] = "张三";

Effet:

2) Valeur

L'utilisation de l'obtention de la valeur et de l'obtention de la valeur est similaire à l'utilisation des variables, sauf que le type renvoyé est le type d'objet, il suffit de faire une conversion

DataTable dt = new DataTable("Datas");
DataColumn dc = new DataColumn();
dc.AutoIncrement = true;//自动增加
dc.AutoIncrementSeed = 1;//起始为1
dc.AutoIncrementStep = 1;//步长为1
dc.AllowDBNull = false;//是否允许空值

//添加列
dt.Columns.Add("姓名", typeof(string));
dt.Columns.Add("年龄", typeof(int));
dt.Columns.Add("身高", typeof(float));
dt.Columns.Add("体重", typeof(float));

//添加行
dt.Rows.Add("1号", 17, 155, 220);
dt.Rows.Add("2号", 12, 220, 300);
dt.Rows.Add("3号", 45, 170, 132);

dataGridView1.DataSource = dt;

//2)取值           
object name = dt.Rows[0]["姓名"];
object age = dt.Rows[0][1];
Console.WriteLine(name);
Console.WriteLine(age);

courir:

 

4. Supprimer la ligne

Il existe de nombreuses façons de supprimer des lignes, vous pouvez utiliser dt.Rows.Remove(dt.Rows[0]);

DataTable dt = new DataTable("Datas");
DataColumn dc = new DataColumn();
dc.AutoIncrement = true;//自动增加
dc.AutoIncrementSeed = 1;//起始为1
dc.AutoIncrementStep = 1;//步长为1
dc.AllowDBNull = false;//是否允许空值

//添加列
dt.Columns.Add("姓名", typeof(string));
dt.Columns.Add("年龄", typeof(int));
dt.Columns.Add("身高", typeof(float));
dt.Columns.Add("体重", typeof(float));

//添加行
dt.Rows.Add("1号", 17, 155, 220);
dt.Rows.Add("2号", 12, 220, 300);
dt.Rows.Add("3号", 45, 170, 132);

//删除行
dt.Rows.Remove(dt.Rows[0]);

dataGridView1.DataSource = dt;

Vous pouvez également utiliser dt.Rows.RemoveAt(0) L'effet est le même

dt.Rows.RemoveAt(0);

courir:

 

5. Parcourez le DataTable

Le nom de la colonne est séparé de la traversée du contenu de la table

DataTable dt = new DataTable("Datas");
DataColumn dc = new DataColumn();
dc.AutoIncrement = true;//自动增加
dc.AutoIncrementSeed = 1;//起始为1
dc.AutoIncrementStep = 1;//步长为1
dc.AllowDBNull = false;//是否允许空值

//添加列
dt.Columns.Add("姓名", typeof(string));
dt.Columns.Add("年龄", typeof(int));
dt.Columns.Add("身高", typeof(float));
dt.Columns.Add("体重", typeof(float));

//添加行
dt.Rows.Add("1号", 17, 155, 220);
dt.Rows.Add("2号", 12, 220, 300);
dt.Rows.Add("3号", 45, 170, 132);

//打印所有列名
string columnName = string.Empty;
for (int i = 0; i < dt.Columns.Count; i++)
{
    columnName += string.Format("{0}({1}) | ", dt.Columns[i].ColumnName, i);
}
Console.WriteLine(columnName);

//打印每一行的数据
foreach (DataRow row in dt.Rows)
{
    string columnStr = string.Empty;
    foreach (DataColumn column in dt.Columns)
    {
        columnStr += row[column] + " | ";
    }
    Console.WriteLine(columnStr);
}

dataGridView1.DataSource = dt;

Imprimer les données de chaque ligne, ne voulez pas utiliser foreach, il est également possible d'utiliser la boucle for.


for (int i = 0; i < dt.Rows.Count; i++)
{
    string columnStr = string.Empty;
    for (int j = 0; j < dt.Columns.Count; j++)
    {
        columnStr += dt.Rows[i][j] + " | ";
    }
    Console.WriteLine(columnStr);
}

Effet courant, Winform et console :

 

6. Déterminer si une valeur existe dans la colonne DataTable

Utilisez DataTable.Select pour interroger les données de la table

DataTable dt = new DataTable("Datas");
DataColumn dc = new DataColumn();
dc.AutoIncrement = true;//自动增加
dc.AutoIncrementSeed = 1;//起始为1
dc.AutoIncrementStep = 1;//步长为1
dc.AllowDBNull = false;//是否允许空值

//添加列
dt.Columns.Add("姓名", typeof(string));
dt.Columns.Add("年龄", typeof(int));
dt.Columns.Add("身高", typeof(float));
dt.Columns.Add("体重", typeof(float));

//添加行
dt.Rows.Add("1号", 17, 155, 220);
dt.Rows.Add("2号", 12, 220, 300);
dt.Rows.Add("3号", 45, 170, 132);

//判断 DataTable 列中是否存在某个值
DataRow[] seleRes = dt.Select(string.Format("{0}='{1}'", "姓名", "2号"));
Console.WriteLine("寻找结果:{0}", seleRes.Length > 0);

courir:

Apporter quelques modifications au code

DataRow[] seleRes = dt.Select(string.Format("{0}='{1}'", "姓名", "2"));
Console.WriteLine("寻找结果:{0}", seleRes.Length > 0);

courir:

 

7. Définir la clé primaire

La clé primaire d'une table doit être unique pour identifier les enregistrements de la table. Des tables avec des clés primaires constituées de deux colonnes ou plus peuvent également être utilisées. Cela se produit lorsqu'une seule colonne ne peut pas contenir suffisamment de valeurs uniques. Par exemple, une clé primaire à deux colonnes peut contenir les colonnes "OrderNumber" et "ProductID". Étant donné qu'une clé primaire peut être constituée de plusieurs colonnes, la propriété PrimaryKey consiste en un tableau d'objets DataColumn.

DataTable dt = new DataTable("Datas");
DataColumn dc = new DataColumn();
dc.AutoIncrement = true;//自动增加
dc.AutoIncrementSeed = 1;//起始为1
dc.AutoIncrementStep = 1;//步长为1
dc.AllowDBNull = false;//是否允许空值

//添加列
dt.Columns.Add("姓名", typeof(string));
dt.Columns.Add("年龄", typeof(int));
dt.Columns.Add("身高", typeof(float));
dt.Columns.Add("体重", typeof(float));

//添加行
dt.Rows.Add("1号", 17, 155, 220);
dt.Rows.Add("2号", 12, 220, 300);
dt.Rows.Add("3号", 45, 170, 132);

//设置主键
DataColumn[] PrimaryKeyColumns = new DataColumn[2];
//添加主键,必须是已经在DataTable里有的列名
PrimaryKeyColumns[0] = dt.Columns["姓名"];
PrimaryKeyColumns[1] = dt.Columns["年龄"];
//配置主键
dt.PrimaryKey = PrimaryKeyColumns;

8. Obtenez le numéro de ligne où se trouve le DataRow

Comment obtenir une clé primaire

DataTable dt = new DataTable("Datas");
DataColumn dc = new DataColumn();
dc.AutoIncrement = true;//自动增加
dc.AutoIncrementSeed = 1;//起始为1
dc.AutoIncrementStep = 1;//步长为1
dc.AllowDBNull = false;//是否允许空值

//添加列
dt.Columns.Add("姓名", typeof(string));
dt.Columns.Add("年龄", typeof(int));
dt.Columns.Add("身高", typeof(float));
dt.Columns.Add("体重", typeof(float));

//添加行
dt.Rows.Add("1号", 17, 155, 220);
dt.Rows.Add("2号", 12, 220, 300);
dt.Rows.Add("3号", 45, 170, 132);

//设置主键
DataColumn[] PrimaryKeyColumns = new DataColumn[1];
//添加主键,必须是已经在DataTable里有的列名
PrimaryKeyColumns[0] = dt.Columns["姓名"];
//配置主键
dt.PrimaryKey = PrimaryKeyColumns;

//获取行号
DataRow dataRow = dt.Rows.Find("3号");
int index = dataRow.Table.Rows.IndexOf(dataRow);
Console.WriteLine("行号:{0}", index);

courir:

S'il s'agit de deux clés primaires, écrivez comme ceci

//设置主键
DataColumn[] PrimaryKeyColumns = new DataColumn[2];
//添加主键,必须是已经在DataTable里有的列名
PrimaryKeyColumns[0] = dt.Columns["姓名"];
PrimaryKeyColumns[1] = dt.Columns["年龄"];
//配置主键
dt.PrimaryKey = PrimaryKeyColumns;

//获取行号
DataRow dataRow = dt.Rows.Find(new object[] { "3号", 45 });
int index = dataRow.Table.Rows.IndexOf(dataRow);
Console.WriteLine("行号:{0}", index);

Le résultat de l'opération est toujours : 2

Notez que le nom et l'âge doivent correspondre ici. Si vous faites une erreur, par exemple, changez 45 en 46, le code signalera également une erreur

 

9. Convertir DataTable en liste<T>

le code


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Reflection;
 
/// <summary>
/// 将DataTable数据源转换成实体类
/// </summary>
public static class ConvertTool
{
    /// <summary>
    /// DataTable转换成实体类
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="dt"></param>
    /// <returns></returns>
    public static List<T> TableToEntity<T>(DataTable dt) where T : class, new()
    {
        List<T> list = new List<T>();
        try
        {
            foreach (DataRow row in dt.Rows)
            {
                T entity = new T();
                PropertyInfo[] pArray = entity.GetType().GetProperties();
 
                foreach (PropertyInfo p in pArray)
                {
                    if (dt.Columns.Contains(p.Name))
                    {
                        if (!p.CanWrite) continue;
                        var value = row[p.Name];
                        if (value != DBNull.Value)
                        {
                            Type targetType = p.PropertyType;
                            Type convertType = targetType;
                            if (targetType.IsGenericType && targetType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
                            {
                                //可空类型
                                NullableConverter nullableConverter = new NullableConverter(targetType);
                                convertType = nullableConverter.UnderlyingType;
                            }
                            if (!string.IsNullOrEmpty(convertType.FullName) && !string.IsNullOrEmpty(value.ToString()))
                            {
                                value = Convert.ChangeType(value, convertType);
                            }
                            switch (convertType.FullName)
                            {
                                case "System.Decimal":
                                    p.SetValue(entity, Convert.ToDecimal(value), null);
                                    break;
                                case "System.String":
                                    p.SetValue(entity, Convert.ToString(value), null);
                                    break;
                                case "System.Int32":
                                    p.SetValue(entity, Convert.ToInt32(value), null);
                                    break;
                                case "System.Int64":
                                    p.SetValue(entity, Convert.ToInt64(value), null);
                                    break;
                                case "System.Int16":
                                    p.SetValue(entity, Convert.ToInt16(value), null);
                                    break;
                                case "System.Double":
                                    p.SetValue(entity, Convert.ToDouble(value), null);
                                    break;
                                case "System.DateTime":
                                    p.SetValue(entity, Convert.ToDateTime(value), null);
                                    break;
                                default:
                                    p.SetValue(entity, value, null);
                                    break;
                            }
                        }
                    }
                }
                list.Add(entity);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
 
        if(list.Count > 0)
            return list;
        else
            return null;
    }
}

10. Convertir List<T> en DataTable

Voici s'il faut convertir le titre ou convertir le titre. Examinons d'abord la conversion directe de List<T> en DataTable. Si le champ de classe d'entité de T est en anglais, les noms de colonne de DataTable seront également affichés en anglais .

/// <summary>
/// 将 List 转换成 DataTable (不转换标题)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="data"></param>
/// <returns></returns>
public static DataTable ToDataTable<T>(List<T> data)
{
    if(data == null || data.Count == 0) return null;

    PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
    DataTable dt = new DataTable();
    for (int i = 0; i < properties.Count; i++)
    {
        PropertyDescriptor property = properties[i];
        dt.Columns.Add(property.Name, property.PropertyType);
    }
    object[] values = new object[properties.Count];
    foreach (T item in data)
    {
        for (int i = 0; i < values.Length; i++)
        {
            values[i] = properties[i].GetValue(item);
        }
        dt.Rows.Add(values);
    }
    return dt;
}

La conversion des champs anglais en noms de colonnes chinois nécessite une certaine conversion. J'ai créé une fonctionnalité personnalisée UserAttribute, comme suit

using System;

//自定义特性类
[AttributeUsage(AttributeTargets.Property)]
internal class UserAttribute : Attribute
{
    public string ChineseName { get; set; }

    public UserAttribute(string chineseName)
    {
        ChineseName = chineseName;
    }
}

Le champ qui sera converti en chinois, ajoutez le nom chinois à la fonctionnalité

internal class UserInfo
{
    [User("用户名")]
    public string UserName { get; set; }

    [User("地址")]
    public string Address { get; set; }

    [User("年龄")]
    public int Age { get; set; }

    [User("重量")]
    public int Weight { get; set; }
}

Méthode de conversion :

/// <summary>
/// 将 List 转换为 DataTable (转换标题)
/// </summary>
/// <param name="list">数据实体</param>
/// <returns></returns>
public static DataTable ListToDataTable<T>(List<T> list)
{
    if (list == null || list.Count == 0) return null;

    //创建一个名为"tableName"的空表
    DataTable dt = new DataTable("tableName");

    //key 中文名, value 英文名
    Dictionary<string, string> dic = new Dictionary<string, string>();

    //创建传入对象名称的列
    foreach (var item in list.FirstOrDefault().GetType().GetProperties())
    {
        object[] attrs = item.GetCustomAttributes(true);
        if (attrs.Length > 0 && attrs[0] is UserAttribute)
        {
            UserAttribute user = attrs[0] as UserAttribute;
            dt.Columns.Add(user.ChineseName);
            dic.Add(user.ChineseName, item.Name);
        }
        else
            dt.Columns.Add(item.Name);
    }

    //循环存储
    foreach (var item in list)
    {
        //新加行
        DataRow value = dt.NewRow();

        //根据DataTable中的值,进行对应的赋值
        foreach (DataColumn dtColumn in dt.Columns)
        {
            int i = dt.Columns.IndexOf(dtColumn);
            string cloumnName = dtColumn.ColumnName;
            if (dic.ContainsKey(cloumnName))
            {
                cloumnName = dic[cloumnName];
            }

            //基元元素,直接复制,对象类型等,进行序列化
            if (value.GetType().IsPrimitive)
            {
                value[i] = item.GetType().GetProperty(cloumnName).GetValue(item);
            }
            else
            {
                value[i] = JsonConvert.SerializeObject(item.GetType().GetProperty(cloumnName).GetValue(item));
            }
        }
        dt.Rows.Add(value);
    }

    return dt;
}

3. Utilisation de DataGridView

1. Données contraignantes

Les données de liaison ont été utilisées plusieurs fois dans le cas ci-dessus, une seule phrase, il suffit de lier le DataSource du contrôle au DataTable.

dataGridView1.DataSource = dt;

Ce n'est pas seulement le type DataTable qui peut être lié ici, DataSet, DataView, ArrayList, Dictionary, List sont tous possibles, donc je ne les montrerai pas un par un ici.

2. Obtenir la source de données liée

Les données liées peuvent être converties en type avant la liaison, comme suit

 DataTable dataTable = (dataGridView1.DataSource as DataTable);

Tester actuellement le type DataTable ne pose aucun problème

3. Obtenir/définir les données de la cellule sélectionnée

Ajoutez d'abord un événement CellClick au contrôle dataGridView1 

le code

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
    //当前的行数
    int selectRowIndex = dataGridView1.CurrentRow.Index;
    //当前的列数
    int selectColumnIndex = dataGridView1.CurrentCell.ColumnIndex;

    DataTable dataTable = (dataGridView1.DataSource as DataTable);
    int rowLen = dataTable.Rows.Count;
    if (selectRowIndex >= rowLen) return;

    Console.WriteLine("当前选中行:{0},选中的列:{1}", selectRowIndex, selectColumnIndex);
}

Après l'exécution, cliquez sur la dernière ligne, dernière colonne

sortie console

 

Une fois les données liées, une ligne sera ajoutée automatiquement. Si vous cliquez ici sur une ligne vide, le nombre de lignes dans le DataTable sera dépassé. Si vous ne portez pas de jugement, une erreur sera signalée. Vous devez faites attention ici.

Avec l'index de ligne et de colonne, il est relativement simple d'obtenir la valeur, il suffit d'obtenir directement la valeur de DataTable

object obj = dataTable.Rows[selectRowIndex][selectColumnIndex];
Console.WriteLine("value:{0}", obj);

Il est également de bon sens de définir sa valeur.

4. Définissez la largeur et la hauteur de la cellule

Largeur et hauteur adaptatives

//根据数据内容自动调整列宽
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader;
//根据数据内容自动调整行高
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders; 

Selon l'exemple du chapitre 2, l'effet

Le système supprime automatiquement la pièce vierge, qui semble particulièrement encombrée, il est préférable de définir manuellement la largeur.

Définissez manuellement la largeur de la colonne, où 0, 1, 2 et 3 sont l'index de la colonne

dataGridView1.Columns[0].Width = 100;
dataGridView1.Columns[1].Width = 100;
dataGridView1.Columns[2].Width = 200;
dataGridView1.Columns[3].Width = 150;

Finir

Si ce message vous est utile, veuillez suivre + aimer + laisser un message, merci!

fin

Je suppose que tu aimes

Origine blog.csdn.net/qq_38693757/article/details/131413486
conseillé
Classement