C# 如何在运行时更改gridview中单元格的值? 细节

C# 如何在运行时更改gridview中单元格的值? 细节,c#,sql,.net,gridview,C#,Sql,.net,Gridview,我有一个datagridview,可以处理数据库中的数据。我有一列有数值,每个数字都表示一个字符串值,例如 0 => "group 1", 1 => "group 2" and so on... 用户必须将此数据视为可读格式,即0=>“组1”。大概是这样的: id priceGroupID ----------- ------------ 1234 -1 => "group -1"

我有一个
datagridview
,可以处理数据库中的数据。我有一列有数值,每个数字都表示一个字符串值,例如

0 => "group 1", 
1 => "group 2" 
and so on...
用户必须将此数据视为可读格式,即0=>“组1”。大概是这样的:

id          priceGroupID
----------- ------------
1234        -1 => "group -1"
36968       0  => "group  0"
1           2  => "group  2"
2           2  => "group  2"
3           2  => "group  2"
1003        2  => "group  2"
在这个链接中:()代表一个想法,但我想要别的东西。更强大的东西。别害羞,如果没有别的办法,请告诉我没有

摘要和问题 简言之:

  • 我希望在Gridview中显示此数据,而不在数据库中进行任何更改
  • 我想要建议的格式。有没有一种简单的方法来制作这种格式,意思是
    n=>“groupm”
  • 我不想在这里使用单元格格式。CellFormatting只是根据数据格式对单元格进行格式化。()
还有一件事:我的编程语言是windows应用程序中的c

我希望说出我的意思

提前谢谢。

当然,很简单

您需要访问行索引,后跟列的名称并设置其值。例如:

this.dataGridView.Rows[0].Cells["FirstName"].Value = "billy";
本例访问第一行和单元格“FirstName”,并将其值更改为“billy”


更改不会影响数据库,但可能会影响数据源绑定,从而导致数据源上的更改。相反,您可能不希望引用该数据源,以便在使用该数据源(如更新)时,更改不会最终提交回数据库。

尝试此操作,您必须创建一个foreach循环来迭代datagridview中的所有项,此示例显示您仅为第一条记录更改它:

int groupIdentifier = this.dataGridView.Rows[0].Cells["Group"].Value;

this.dataGridView.Rows[0].Cells["Group"].Value = GetGroupName(groupIdentifier);

List<Groups> ListGroups = new List<Groups>();

private string GetGroupName(int groupIdentifier)
{
    var group = ListGroups.FirstOrDefault(g=>g.Id == groupIdentifier);
    return group.Name;
}
int-groupIdentifier=this.dataGridView.Rows[0]。单元格[“组]。值;
this.dataGridView.Rows[0]。单元格[“组”]。值=GetGroupName(groupIdentifier);
列表组=新列表();
私有字符串GetGroupName(int groupIdentifier)
{
var group=ListGroups.FirstOrDefault(g=>g.Id==groupIdentifier);
返回组名称;
}
填充网格时使用此选项

希望这有帮助,让我们看看你得到了什么

我希望在gridview中显示此数据,而不在我的数据库中进行更改

太好了,应该是这样的数据必须与数据表示分离

我不想在这里使用单元格格式。cellformatting只是根据数据格式对单元格进行格式化

错了

格式设置正是您所需要的。同一数据可以用多种方式表示。例如,一个和数字或日期值可以使用数千种方式(格式)显示(格式化)。这正是(和其他
格式
)方法所做的。另一个例子是显示
bool
值的
Checkbox
。另一个例子是
ComboBox
ValueMember
显示为
DisplayMember
。等等

事实上,您的需求是
格式
函数的一种变体,可以通过以下方法实现。您只需将属性设置为“组0”

与一些人所说的相反,如果形式还不够,那么活动正是你所需要的

默认情况下,DataGridView控件将尝试将单元格的值转换为适合显示的格式。例如,它将数值转换为字符串,以显示在文本框单元格中。通过设置由DefaultCellStyle属性等属性返回的DataGridViewCellStyle的Format属性,可以指示要使用的格式约定

如果标准格式不足,可以通过处理CellFormattingevent自定义格式。此事件允许您指示要用于单元显示的确切显示值以及单元样式,例如背景色和前景色。这意味着您可以为任何类型的单元格格式处理此事件,而不管单元格值本身是否需要格式化

在大多数情况下,对性能的影响可以忽略不计,因为只有在需要在屏幕上显示时,才会将值转换为字符串,并且屏幕上的行数与总行数相比是有限的(如果您有大量数据)

值/显示文本分隔的优点之一是网格排序工作正常(按数字而不是按文本)

总之,不要被愚弄,将数据存储值转换为显示值。每个控件都有格式化功能,只需使用它们即可。既然您要求一种简单的方法,
Format
属性是您案例中最简单但有效的解决方案

下面是一个使用两种格式方法的100000行的示例(注释一个,取消注释另一个)。您可以看到,绝对没有性能问题,
GroupId
列排序工作正常

using System;
using System.Data;
using System.Linq;
using System.Windows.Forms;

namespace Samples
{
    static class Program
    {
        static void UseFormat(DataGridView dg)
        {
            dg.ColumnAdded += (sender, e) =>
            {
                if (e.Column.DataPropertyName == "GroupId")
                {
                    e.Column.DefaultCellStyle.Format = "Group 0";
                }
            };
        }

        static void UseCellFormatting(DataGridView dg)
        {
            dg.CellFormatting += (sender, e) =>
            {
                if (e.ColumnIndex >= 0 && e.RowIndex >= 0)
                {
                    var column = dg.Columns[e.ColumnIndex];
                    if (column.DataPropertyName == "GroupId" && e.Value != null)
                    {
                        e.Value = "Group " + e.Value.ToString();
                        e.FormattingApplied = true;
                    }
                }
            };
        }

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            var form = new Form();
            var dg = new DataGridView { Dock = DockStyle.Fill, Parent = form, ReadOnly = true, AllowUserToAddRows = false };
            UseFormat(dg);
            //UseCellFormatting(dg);
            var data = new DataTable();
            data.Columns.Add("Id", typeof(int));
            data.Columns.Add("GroupId", typeof(int));
            var groupIds = Enumerable.Range(0, 15).ToArray();
            for (int i = 0; i < 100000; i++)
                data.Rows.Add(i, groupIds[i % groupIds.Length]);
            dg.DataSource = data;
            Application.Run(form);
        }
    }
}
使用系统;
使用系统数据;
使用System.Linq;
使用System.Windows.Forms;
名称空间示例
{
静态类程序
{
静态void UseFormat(DataGridView dg)
{
dg.e+=(发送方,e)=>
{
if(e.Column.DataPropertyName==“GroupId”)
{
e、 Column.DefaultCellStyle.Format=“组0”;
}
};
}
静态void UseCellFormatting(DataGridView dg)
{
dg.CellFormatting+=(发送方,e)=>
{
如果(e.ColumnIndex>=0&&e.RowIndex>=0)
{
var列=dg列[e.ColumnIndex];
if(column.DataPropertyName==“GroupId”&&e.Value!=null)
{
e、 Value=“Group”+e.Value.ToString();
e、 FormattingApplied=true;
}
}
};
}
[状态线程]
静态void Main()