DataGridView:更改数据源后保留选择吗?

2023-12-01

有没有办法在更改数据源后保持 DataGridView 的选定单元格处于选中状态?


您可以根据特定于您的需求的条件来匹配应选择的内容,只需根据您的匹配将单元格或行的 Select 属性设置为 true/false 即可。这是一个简单的示例,您可以将其放入新创建的 winforms 项目中来说明这一点。为了使此示例正常工作,请确保设置 DataGridView 的 SelectionMode = FullRowSelect。如果您想保留/重新应用单元格选择,方法将类似。注意:您也可以只保留选定行索引的列表,但这在加载另一个数据源时通常没有意义,因为实际行与其在数据中的物理位置之间通常不太可能存在任何对应关系。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace DataGridViewRetainSelection
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private readonly List<Person> currentPeople = new List<Person>();
        private bool dummyToggle = true;

        private void Form1_Load(object sender, EventArgs e)
        {
            SwitchDataSource(); // will just new up the datasource
        }

        private void ButtonSwitchDataSourceClick(object sender, EventArgs e)
        {
            SwitchDataSource();
        }

        private void SwitchDataSource()
        {
            var selectedPeople = (from DataGridViewRow row in dataGridViewPeople.Rows where row.Selected select currentPeople[row.Index]).ToList();

            peopleBindingSource.DataSource = null;

            currentPeople.Clear();
            if (dummyToggle)
            {
                currentPeople.Add(new Person { Name = "Joel Spolsky" });
                currentPeople.Add(new Person { Name = "Jeff Atwood" });
                currentPeople.Add(new Person { Name = "Jarrod Dixon" });
                currentPeople.Add(new Person { Name = "Geoff Dalgas" });
                currentPeople.Add(new Person { Name = "Brent Ozar" });
            }
            else
            {
                currentPeople.Add(new Person { Name = "Joel Spolsky" });
                currentPeople.Add(new Person { Name = "Jeff Atwood" });
                currentPeople.Add(new Person { Name = "Brent Ozar" });
            }

            dummyToggle = !dummyToggle;

            peopleBindingSource.DataSource = currentPeople;

            foreach (var person in selectedPeople)
            {
                foreach (DataGridViewRow row in dataGridViewPeople.Rows)
                {
                    if (string.Equals(row.Cells[0].Value, person.Name))
                    {
                        row.Selected = true;
                    }
                }
            }
        }
    }

    public sealed class Person
    {
        public string Name { get; set; }
    }

}

要为选定的单元格实现相同的功能,请执行以下操作。如果其他人需要它,我将保留以前的代码。注意:我只是在这里敲出一个匿名类型,您可能需要根据成员字段、属性等做一些更复杂的事情,但是设置所选单元格的一般原理已正确说明并且可以我希望可以轻松地进行测试和调试以便理解。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace DataGridViewRetainSelection
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private readonly List<Person> currentPeople = new List<Person>();
        private bool dummyToggle = true;

        private void Form1_Load(object sender, EventArgs e)
        {
            dataGridViewPeople.SelectionMode = DataGridViewSelectionMode.CellSelect;
            SwitchDataSource(); // will just new up the datasource
        }

        private void ButtonSwitchDataSourceClick(object sender, EventArgs e)
        {
            SwitchDataSource();
        }

        private void SwitchDataSource()
        {
            var selectedPeopleAndCells = (from DataGridViewCell cell in dataGridViewPeople.SelectedCells where cell.Selected select new { Person = currentPeople[cell.RowIndex], Cell = cell }).ToList();

            peopleBindingSource.DataSource = null;

            currentPeople.Clear();
            if (dummyToggle)
            {
                currentPeople.Add(new Person { Name = "Joel Spolsky", Id = 0 });
                currentPeople.Add(new Person { Name = "Jeff Atwood", Id = 1 });
                currentPeople.Add(new Person { Name = "Jarrod Dixon", Id = 2 });
                currentPeople.Add(new Person { Name = "Geoff Dalgas", Id = 3 });
                currentPeople.Add(new Person { Name = "Brent Ozar", Id = 4 });
            }
            else
            {
                currentPeople.Add(new Person { Name = "Joel Spolsky", Id = 0 });
                currentPeople.Add(new Person { Name = "Jeff Atwood", Id = 1 });
                currentPeople.Add(new Person { Name = "Brent Ozar", Id = 4 });
            }

            dummyToggle = !dummyToggle;

            peopleBindingSource.DataSource = currentPeople;

            foreach (var personAndCell in selectedPeopleAndCells)
            {
                foreach (DataGridViewRow row in dataGridViewPeople.Rows)
                {
                    if (string.Equals(row.Cells[0].Value, personAndCell.Person.Id))
                    {
                        row.Cells[personAndCell.Cell.ColumnIndex].Selected = true;
                    }
                }
            }
        }
    }

    public sealed class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DataGridView:更改数据源后保留选择吗? 的相关文章

  • 检查两个数是否是彼此的排列?

    给定两个数字 a b 使得 1 例如 123 是 312 的有效排列 我也不想对数字中的数字进行排序 如果您指的是数字的字符 例如 1927 和 9721 则 至少 有几种方法 如果允许排序 一种方法是简单地sprintf将它们放入两个缓冲
  • 如何检查图像对象与资源中的图像对象是否相同?

    所以我试图创建一个简单的程序 只需在单击图片框中更改图片即可 我目前只使用两张图片 所以我的图片框单击事件函数的代码 看起来像这样 private void pictureBox1 Click object sender EventArgs
  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • 当我使用“control-c”关闭发送对等方的套接字时,为什么接收对等方的套接字不断接收“”

    我是套接字编程的新手 我知道使用 control c 关闭套接字是一个坏习惯 但是为什么在我使用 control c 关闭发送进程后 接收方上的套接字不断接收 在 control c 退出进程后 发送方的套接字不应该关闭吗 谢谢 我知道使用
  • C++ 子字符串返回错误结果

    我有这个字符串 std string date 20121020 我正在做 std cout lt lt Date lt lt date lt lt n std cout lt lt Year lt lt date substr 0 4 l
  • 使闭包捕获的变量变得易失性

    闭包捕获的变量如何与不同线程交互 在下面的示例代码中 我想将totalEvents 声明为易失性的 但C 不允许这样做 是的 我知道这是错误的代码 这只是一个例子 private void WaitFor10Events volatile
  • 当 contains() 工作正常时,xpath 函数ends-with() 工作时出现问题

    我正在尝试获取具有以特定 id 结尾的属性的标签 like span 我想获取 id 以 国家 地区 结尾的跨度我尝试以下xpath span ends with id Country 但我得到以下异常 需要命名空间管理器或 XsltCon
  • 如何将图像和 POST 数据上传到 Azure 移动服务 ApiController 终结点?

    我正在尝试上传图片and POST表单数据 尽管理想情况下我希望它是json 到我的端点Azure 移动服务应用 我有ApiController method HttpPost Route api upload databaseId sea
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • Github Action 在运行可执行文件时卡住

    我正在尝试设置运行google tests on a C repository using Github Actions正在运行的Windows Latest 构建过程完成 但是当运行测试时 它被卡住并且不执行从生成的可执行文件Visual
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • clang 实例化后静态成员初始化

    这样的代码可以用 GCC 编译 但 clang 3 5 失败 include
  • 当操作繁忙时,表单不执行任何操作(冻结)

    我有一个使用 C 的 WinForms 应用程序 我尝试从文件中读取一些数据并将其插入数据表中 当此操作很忙时 我的表单冻结并且无法移动它 有谁知道我该如何解决这个问题 这可能是因为您在 UI 线程上执行了操作 将文件和数据库操作移至另一个
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver
  • ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

    如何在 ASP NET 5 MVC6 中使用这些方法 在 MVC5 中 我在 Global asax 中使用了它 现在呢 也许是入门班 protected void Application PreSendRequestHeaders obj
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我

随机推荐

  • 如何使用 CloudFormation 在 Redhat 中安装 aws-cfn-bootstrap/cfn-init 软件包?

    我正在尝试使用 CloudFormation 模板启动实例 实例已启动 但 UserData 部分未完全执行 因为cfn init aws cfn bootstrapRedhat 7 AMI 中未安装软件包 我尝试安装aws cfn boo
  • 消息、队列和 ESB - 我知道我想去哪里,但不知道如何到达那里

    长话短说 我正在开展一个项目 出于所有常见原因 我们正在重写一个大型 Web 应用程序 重写的主要目的是将在单个服务器上运行的大型单一应用程序分成许多较小的解耦应用程序 这些应用程序可以在许多服务器上运行 好的 这就是我想要的 我想HTTP
  • Qt 和高 dpi 屏幕

    我读过几篇关于此的文章 所以我有一台 Dell XPS 13 并将文本 应用程序和其他项目的大小更改为 200 但我想我的问题如下 当我通过 Qt Designer 启动应用程序时 一切看起来都很好 但是当我在设计器之外运 行应用程序时 意
  • 从 WPF 中的 Web 浏览器调用 HTML 页面中存在的 JavaScript 函数

    我是 WPF 新手 我在我的 wpf 应用程序中使用 WebBroswer 来渲染 Google 地图 我有一个 googlemap htm 页面 它包含一个初始化 lat log JavaScript 函数 现在我想使用 lat 和 lo
  • javascript 与数组的奇怪行为

    让我们考虑以下 JavaScript 片段 var arr function pushMe var temp name me arr push temp console log arr temp name you arr push temp
  • 根据 W3C XML 架构定义验证 XSD

    我正在生成一些 XML 模式 并希望确保我们的生成器正在创建有效的 XML 模式文档 不是 XML 我试图编写代码来验证 XML 模式文档 但失败了 我没想到会这么复杂 private void validateXsd String xsd
  • 静态内部类需要导入注释

    因此 我正在进行一些 jUnit 测试 并希望编写具有相似功能但足够小以在单个类中编写的不同类 无论设计决定如何 它都会给我带来编译器错误 我不确定我所看到的规则是什么 你可以想象它看起来像 package foo RunWith Suit
  • Realm - 模块文件是由旧版本的编译器创建的

    我使用最新版本的 xcode 和 swift 2 2 我的一个项目 由于错误 我已经好几个月没有打开了 现在还没有构建module file was created by an older version of compiler 我尝试了以
  • Mockito 单元测试 - 时间戳不同

    Mockito 测试存在一些问题 我目前收到此错误 Argument s are different Wanted repository save uk co withersoft docservice repositories hiber
  • 如何取消WCF服务调用?

    我有一个执行时间很长的WCF函数 所以我用backgraundworker在UI中调用该函数 我想提供一个取消执行的功能 所以我中止IComunicationObject 问题是服务执行没有停止 是在这种情况下有什么方法可以停止服务执行吗
  • 尽管 CloudWatch 代理正在运行,但 CloudWatch 日志组丢失

    我在 EC2 实例上看不到 Cloud Watch 代理定义的日志组 此外 默认日志组 var log messages 不可见 我在 root 帐户上也看不到这些日志 我配置了其他日志组并且可见 我有以下设置 亚马逊Linux 附加到实例
  • 我应该使用什么来为 heroku 上的 Rails 生成站点地图?

    作为 Rails 的初学者 我发现由于其只读限制 在 Heroku 上生成站点地图非常令人畏惧 然而 站点地图是我网站的基础 因为它的成功基于搜索引擎优化 我尝试过dynamic sitemaps gem 但很快就删除了它 因为我意识到它没
  • 使用 http:// 添加自定义 URL 架构

    我想向我的 iPhone 应用程序添加自定义 URL 以便其他应用程序能够打开它 不过 我希望 URL 以 http 开头 更详细地说 我想通过我发送给用户的电子邮件中的链接打开应用程序 并且如果从电子邮件中读取电子邮件 则该链接必须有效
  • OSX 10.8 登录项

    我找到了这个在 Package Maker 安装程序 postflight 脚本期间将应用程序添加到 OSX 登录项 但它似乎不适用于 OSX 10 8 这是来自另一个问题 适用于其他所有问题 defaults write Library
  • jquery 无限滑块 图片

    我正在尝试使用 jquery 创建一个无限滑块 我的页面有一些标签 其宽度等于窗口宽度 我想在 10 秒后滑动每张图像 当最后一张图像出现且第一张图像显示时 我希望它从右侧静止下来 现在我创建了一个宽度很大的 div 10000px 来保存
  • 双精度的精确二进制表示[重复]

    这个问题在这里已经有答案了 可能的重复 C 中的浮点数转换为二进制 我有一个非常小的双变量 当我打印它时 我得到 0 使用 C 现在为了获得更好的精度我尝试使用 cout precision 18 i think 18 is the max
  • WebView 中的 Android +1 按钮

    我尝试使用他们描述的方法将 Google 的 1 按钮放入 WebView 中 我已经初始化了 WebView 如下所示 final WebView web WebView findViewById R id webView web get
  • 可定制/动态 SWF 生成

    想知道是否有人知道如何制作可定制的 Flash swf 文件 其中似乎有一个 swf 模板 用户可以输入一些更改 例如文本或图像 并接收包含更改的新编译的 swf 文件 一些例子 http flashfreezer com landingc
  • Bootstrap 4.0 网格系统布局不起作用

    我正在尝试使用引导程序进行布局 但我无法弄清楚我做错了什么 我放入两列 6 列 第二列 6 列 我放入两列 3 列 但它不起作用 我是引导新手 这是代码
  • DataGridView:更改数据源后保留选择吗?

    有没有办法在更改数据源后保持 DataGridView 的选定单元格处于选中状态 您可以根据特定于您的需求的条件来匹配应选择的内容 只需根据您的匹配将单元格或行的 Select 属性设置为 true false 即可 这是一个简单的示例 您