C# 中BindingSource 的用法

2023-11-18

C# BindingSource

1.引言
BindingSource组件是数据源和控件间的一座桥,同时提供了大量的API和Event供我们使用。使用这些API我们可以将Code与各种具体类型数据源进行解耦;使用这些Event我们可以洞察数据的变化。
2.简单绑定
    DataTable myTable = myTableAdapter.GetData();//创建Table
    BindingSource myBindingSource= new BindingSource();//创建BindingSource
    DataGridView myGrid = new DataGridView();//创建GridView
    myGrid.DataSource = myBindingSource;//将BindingSource绑定到GridView
    myTable;//绑定数据到BindingSource
    注:
    1)绑定到DataTable,其实是绑定到DataTable提供的DataView上。每个DataTable都有一个缺省的DataView
    2)DataView是绑定的实质,正如其名,它是DataTable的数据的展现。因此可以对同一个DataTable
    ,构建多个DataView,进而可以对这同样的数据实施不同的过滤、排序等方法,从不同侧面展示DataTable。这也体现了一定的MVC思想。
    3)BindingSouce也可作为数据(其实是数据引用)的容器在不同窗体间传递,从而实现在弹出窗体中对数据的编辑 
3.主细表
    image
    以上图所示数据为例:
    1)DataSet:myDataSet
    2)DataTable:ParentTable、ChildTable、GrandChildTable
    3)Relation:FK_Parent_Child、FK_Child_GrandChild
    //绑定父数据
    parentBindingSource.DataSource = myDataSet;
    parentBindingSource.DataMember = "ParentTable";
    m_GrandParentGrid.DataSource = m_GrandParentBindingSource;
    //绑定子数据。
    childBindingSource.DataSource = parentBindingSource;//绑定到“父BindingSource”,而不是父Table
    childBindingSource.DataMember = "FK_Child_GrandChild";//绑定到“父-子Relation”
    //绑定孙子数据。
    grandChildBindingSource.DataSource = childBindingSource;//绑定到“子BindingSource”
    grandChildBindingSource.DataMember = "FK_Child_GrandChild";//绑定到“子-孙Relation”
这样你就可以在Form上摆上3个DataView,分布绑定到这3个BindingSouce,很容易就实现了主细表关联展现。
4.数据操纵
要操纵数据,首先需要获取当前数据项。BindingSource的Current属性返回DataRowView类型的对象(就像DataView是对 DataTable的封装一样,DataRowView是对DataRow的封装),它是对当前数据项的封装,可以通过类型转换变成你想要的对象。
    DataRowView currentRowView = myBindingSource.Current;//获取当前RowView
    CustomersRow custRow = currentRowView.Row as CustomersRow;//类型转换为当前数据项
    string company = custRow.CompanyName;//使用当前数据项
    string phoneNo = custRow.Phone;
5.用BindingSource做数据容器
BindingSource还可以用作数据容器,即便它没有绑定到数据源上,它内部有一个可以容纳数据的list。
5.1Add方法
调用Add方法会在BindingSource的list中插入数据项。如果这时第一次插入数据,并且没有绑定数据,那么插入数据的类型就决定了今后此list中数据的类型。
    注:
    1)此时再插入其它类型对象会抛出InvalidOperationException异常
    2)设置DataSource属性时会刷新list,造成Add方法添加到list中的数据丢失
5.2AddNew方法
AddNew方法返回BindingSourc所容纳数据类型的对象;如果之前没有容纳数据,则会返回Object对象。
AddNew方法会调用EndEdit方法,并将提交对当前数据的操纵;然后新数据项就成为当前项。
AddNew方法会引发AddingNew事件,可以在此事件中为数据项赋值,或者创建新数据项
    private void OnAddingNew(object sender, AddingNewEventArgs e)
    {
          e.NewObject = new MyCustomObject();//
    }
6.用BindingSource对数据排序、过滤、搜索
6.1 Sort
为Sort属性赋上Sort表达式,可以对数据进行排序
    myBindingSource.Sort = "ContactName ASC";//对ContanctName列按ASC进行排序
    myBindingSource.Sort = "Region ASC, CompanyName DESC"//先按Region、再按CompanyName排序
6.2 Find
    Find方法根据指定属性和关键字进行查找,并返回第一个匹配对象的Index
    int index = m_CustomersBindingSource.Find("CompanyName",IBM);//按CompanyName查找IBM
    if (index != -1)
    {
        myBindingSource.Position = index;//定位BindingSource
    }
6.3 Filter
为Filter属性赋上表达式,可以对数据进行过滤
    m_CustomersBindingSource.Filter = "Country = 'Germany'";//过滤出Country属性为Germany的数据
7.用Event监控数据
7.1 Event
    1)AddingNew
    调用AddNew()方法时触发。
    2)BindingComplete
    当控件完成数据绑定时触发,说明控件已经从数据源中读取当前数据项的值。当BindingSource重新绑定或当前数据项改变时,会触发此事件
    注:
        * 当有多个控件绑定到同一数据源时,这个事件会触发多次
    3)CurrrentChanged
    当前数据项改变时触发此事件。触发此事件的情况如下
        * Position属性改变时
        * 添加、删除数据时
        * DataSource或DataMember属性改变时
    4)CurrentItemChanged
    当前数据项的值改变时触发
    5)DataError
    通常输入无效数据时,由CurrencyManage抛出异常,从而触发此事件。
    6)PositionChanged
    Position属性改变时触发此事件。
    7)ListChanged
    数据集合改变时触发。触发此事件的情况如下
        * adding, editing, deleting, 或 moving 数据项时
    改变那些会影响List行为特征的属性时,如AllowEdit属性
        * 替换List时(绑到新数据源)
8.限制数据修改
BindingSource不仅是数据源与控件间的“桥梁”,同时也是数据源的“看门人”。通过BindingSource,我们可以控制对数据的修改。
BinidingSource的AllowEdit, AllowNew和AllowRemove属性可以控制客户端代码和控件对数据的修改
9.复杂数据类型的Binding
对于String类型的数据,直接Binding到Text控件即可,对于复杂类型有下面几种情况
    * 对于DateTime、Image等类型的数据,它们存储的格式与显示要求并不一致。
    * 有时,你并不想显示客户ID,而是希望显示客户名称
    * 数据库中的Null值
9.1 Binding类
解决以上问题的关键是要理解Binding类,了解它是如何控制数据Binding的过程。
    DataTable table = customersDataSet.Customers;
    //将TextBox的Text属性Binding到table的CustomerID列
    customerIDTextBox.DataBindings.Add("Text", table,"CustomerID", true);
    //上面一行代码等同下面两行代码
    Binding customerIDBinding = new Binding("Text", table,"CustomerID", true);
    customerIDTextBox.DataBindings.Add(customerIDBinding);
从代码可以看出,Binding是数据源(table)和控件(customerIDTextBox)间的中介人,它有以下功能
    * 从数据源取数据,并按照控件要求的数据类型对此数据进行格式化(Formatting),然后传给控件
    * 从控件取数据,并按照数据源的数据类型要求对此数据进行解析(Parsing),然后返回给数据源
    * 自动对数据进行格式转换
9.2Binding类构造函数和属性
Binding构造函数有多个重载版本,下面介绍其重要的参数,这些参数同时存在于Binding对象的属性中。下面介绍中,参数名和属性名都列出来
    1)formattingEnabled(属性FormattingEnabled)
          o true,Binding对象自动在数据源类型和控件要求的类型间进行转换
          o false,反之
    2)dataSourceUpdateMode
    决定控件上数值的改变在何时提交回数据源
    3)nullValue
    DBNull、 null和Nullab<T>对应的值。
    4)formatString
    格式转换
    5)formatInfo
    一个实现IFormatProvider接口的对象引用,用来自定义格式转换
要了解类型如何转换的,请学习Type Conversions and Format Providers相关内容。关于上面属性的应用,请看下面介绍
9.3基于Binding类的内置机制(属性、参数)进行类型转换
通过Binding类构造时的参数,或属性设置,可以控制它进行类型转换的机制。
1)DateTime
下面先介绍一个DateTime类型的例子,使用DateTimePicker控件
    //创建Binding,设置formattingEnabled为true
    birthDateTimePicker.DataBindings.Add("Value",m_EmployeesBindingSource, "BirthDate", true);
    //设定为使用自定义格式
    birthDateTimePicker.Format = DateTimePickerFormat.Custom;
    //设定格式
    birthDateTimePicker.CustomFormat = "MM/dd/yyyy";
2)Numeric
    salaryTextBox.DataBindings.Add("Text", employeesBindingSource,"Salary", true,  DataSourceUpdateMode.OnValidation,"<not specified>", "#.00");
    以上代码做了以下处理
        * 设定formattingEnabled为true:代表自动类型转换
        * 设定DataSourceUpdateMode为OnValidation:
        * 设定nullValue为"<not specified>":这些DBNull就显示为,"<not specified>", 同时用户录入,"<not specified>"时,数据值为DBNull
        * 设定formatString为"#.00":数值保留2位小数
9.4. 事件
下面介绍Binding的主要事件,以及如何基于这些事件进行类型转换的控制。
主要事件:
1)Format事件
发生在从数据源获取数据后,控件显示此数据之前。在这个事件里将数据源的数据类型转换为控件要求的数据类型。
2)Parse事件
与Event相反。它发生控件值改变后,数据更新回数据源之前。在这个事件里将控件的数据类型转换为数据源要求的数据类型。
这两个事件为我们控制数据提供了机制,它们都声明为ConvertEventHandler类型,
    void ConvertEventHandler(object sender, ConvertEventArgs e);
有两个参数,第二个参数ConvertEventArgs e 提供了我们要formatting和parsing的数据。它有两个属性
    * e.DesiredType是数值要转换的目标类型
    * e.Value是要转换的数值。我们可以替换此Value
9.5. 基于事件的类型转换
9.5.1 处理Format Event
    void OnCountryFromFormat(object sender, ConvertEventArgs e)
    {
        if (e.Value == null || e.Value == DBNull.Value)
        {
             pictureBox.Image = null;
             return;
        }
        //绑定的是数据源的CountryID字段,因此e.Value返回的ID号,通过此ID号取得对应数据行
        CountriesRow countryRow =    GetCountryRow((int)e.Value);
         //将e.Value赋值为CountryName,从而在控件中显示名称
         e.Value = countryRow.CountryName;
        // 数据转换
        ImageConverter converter = new ImageConverter();
        pictureBox.Image =    converter.ConvertFrom(countryRow.Flag) as Image;
    }
9.5.2 处理Format Event
void OnCountryFromParse(object sender, ConvertEventArgs e)
{
// Need to look up the Country information for the country name
ExchangeRatesDataSet.CountriesRow row =
GetCountryRow(e.Value.ToString());
if (row == null)
{
string error = "Country not found";
m_ErrorProvider.SetError(m_CountryFromTextBox, error);
m_CountryFromTextBox.Focus();
throw new ArgumentException(error);
}
e.Value = row.CountryID;
}
10 完成数据编辑
经常会遇到这种情况,你在一个控件中录入或选择一些数据,只有当年离开此控件时,关联的数据才能同步更新。这个问题是由DataRow内部机制决定的。
DataRowView类实现IEditableObject接口,支持对象的事务性编辑(当你确认完成编辑前,可以回滚数据)。我们通过BeginEdit()方法来开始数据编辑,通过EndEdit()方法提交编辑。
不要将DataRowView的EndEdit()与DataSet、DataTable、DataRow的AcceptChanges()方法混淆。 DataRow有original和current版本,同时IEditableObject的caching机制让它有transient版本,在调用 EndEdit()方法前,数据修改是不会提交到数据源。这就是前面问题的内在原因。
如果希望编辑的数据立即提交,那调用 EndEdit()函数的最佳位置就是Validated事件。Validate事件在控件录入的数据parsed,并且通过validate后触发,在这个事件中触发EndEdit()就会通知绑定到同一数据源的所有控件,从而实现数据同步更新。
    private void OnCountryTextValidated(object sender, EventArgs e)
    {
              exchangeRatesBindingSource.EndEdit();
    }
当然,当前数据项改变时,也会触发EndEdit()事件
11 使用AutoComplete
当你希望TexbBox或ComboBox中会自动提示功能,那你应该学习一下AutoComplete功能。下面以TextBox为例介绍相关步骤
1)设定TextBox的AutoCompleteSource属性:FileSystem, HistoryList, RecentlyUsedList
2)如果希望使用自定义的列表,则设定AutoCompleteSource属性为CustomSource
3)设定AutoCompleteMode为SuggestAppend。这意味着你输入部分字符时,控件在下拉列表中提示所有相近的数据
4)如果不想使用内置的提示源,你可以自己创建一个AutoCompleteStringCollection类的列表,
5)创建这个列表后,将它赋给TextBox的AutoCompleteCustomSourc属性
12 DataBinding的生命周期
BindingSource的DataSourceUpdateMode属性是关键,它有以下三种可能值,下面分布以TextBox控件为例介绍此属性不同时DataBinding的生命周期
1)OnValidating(缺省值)
    * DataBinding的生命周期:
    TextBox.Leave, TextBox.Validating, Binding.Parse, TextBox.Validated
    * 此时若将控件的CausesValidation属性设为false,那么Validating事件就不会发生
2)OnPropertyChanged
    * DataBinding的生命周期:
    此时,每次控件值发生改变时都会触发Binding.Parse。对TextBox控件来说,每次录入字符都会触发Binding.Parse。
3)Never
    此时Parse事件不会触发,也就是说控件将成为只读的。
13 子父绑定
前面介绍了主细绑定,它其实是一个父子绑定。有时我们希望由子到父的关联绑定,下面我们就一起来实现这个机制。实现这个机制的关键还是Event,这个Event就是BindingSource的CurrentChanged事件
    private void OnCurrentChanged(object sender, EventArgs e)
          {
             // 获取当前的子DataRow
             ExchangeRatesDataSet.ExchangeRatesRow currentRow =
                (ExchangeRatesDataSet.ExchangeRatesRow)
                ((DataRowView)m_ExchangeRatesBindingSource.Current).Row;
             // 获取关联的父DataRow
             ExchangeRatesDataSet.CountriesRow fromCountryRow =
                currentRow.CountriesRowByFK_ExchangeRates_CountriesFrom;
             ExchangeRatesDataSet.CountriesRow toCountryRow =
                currentRow.CountriesRowByFK_ExchangeRates_CountriesTo;
             //显示父DataRow的信息
             if (fromCountryRow != null && toCountryRow != null)
             {
                m_FromCountryCombo.SelectedValue = fromCountryRow.CountryID;
                m_ToCountryCombo.SelectedValue = toCountryRow.CountryID;
             }
    }
14 绑定到数据的多个复本
有 时,我们希望以不同角度看到同一数据,这时需要绑定到同一数据的多个复本。这里的关键是CurrencyManager类,每个 BindingSource管理着一个CurrencyManager。如果多个控件绑定到同一个BindingSource,那么只有一个 CurrencyManager,因此也就只有一个CurrentItem,这样就造成这些绑定到同一BindingSource的控件同步刷新。要解决这个问题,我们需要多个CurrencyManager,也就是说我们可以创建多个BindingSource,且绑定到同一个数据源。
 
 
9.5 处理Null类型
这里有两个概念要弄清楚,.Net内置的Null类型与代表数据库中的Null类型,以及它们的区别。
    1).Net内置的Null类型
        * Nullable,引用类型
        * Nuallable<T>,值类型
    2).Net用来代表数据库中的Null类型
        * DBNull,它有一个属性Value,可以用来判断数据是否为DBNull
              if (northwindDataSet.Employees[0].Country == DBNull.Value)
             {
                     // Handle null case here
              }
             对强类型数据集
    if (northwindDataSet.Employees[0].IsCountryNull())
    {
    // Handle null case here
    }
 
1)AddNew()函数:用来添加一条数据,返回类型由绑定的DataSource决定。
    1)绑定到DataSet/DataTable时,返回DataRowView对象。
    注意:
          a)返回的不是DataSet或DataTable或DataRow。
          b)如果希望获取添加的数据,需要进行类型转换
               //bs为你创建的BindingSource
              DataRow row=(DataRow)((DataRowView) bs.AddNew()).Row;
           c)使用TypedDataSet时,转换方法与上面类似,只是用TypedDataRow而已
             //MyDataRow为你定义的TypedDataRow
              MyDataRow row=(MyDataRow)((DataRowView) bs.AddNew()).Row;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 中BindingSource 的用法 的相关文章

  • Asp.net core默认路由

    简化版Startup code public void ConfigureServices IServiceCollection services services AddMvc public void Configure IApplica
  • 在 Web 浏览器中禁用 F5 [重复]

    这个问题在这里已经有答案了 可能的重复 禁用浏览器的后退按钮 https stackoverflow com questions 961188 disable browsers back button 如何禁用浏览器上的 F5 刷新 htt
  • 当从后台工作程序发生事件时,XlCall.Excel(XlCall.xlcCalculateNow) 抛出 XlCallException

    我有一个 ExcelFunction 来排队一些计算 ExcelFunction public static void QueueCalcs takes ranges var calcRequests builds list of calc
  • 使用 Xamarin.Forms 和 Zxing 生成 QR 码

    我在网上看到了很多关于这个的内容 旧帖子 但似乎没有什么对我有用 我正在尝试从字符串中生成二维码并将其显示在应用程序中 这就是我一开始的情况 qrCode new ZXingBarcodeImageView BarcodeFormat Ba
  • OpenGL缓冲区更新[重复]

    这个问题在这里已经有答案了 目前我正在编写一个模拟水的程序 以下是我所做的步骤 创建水面 平面 创建VAO 创建顶点缓冲区对象 在其中存储法线和顶点 将指针绑定到此 VBO 创建索引缓冲区对象 然后我使用 glDrawElements 渲染
  • libtool 在 Ubuntu 13.04 上构建 thrift 0.9.1 时出错

    在 Ubuntu 13 04 上构建 thrift 0 9 1 支持 C C java C perl python 时出现此错误 configure 不带任何选项运行 make 不带任何选项运行 Making all in test mak
  • 如何调整 Windows 窗体以适应任何屏幕分辨率?

    我知道这是重复的问题 但我检查了所有其他相关问题 他们的答案没有帮助 结果仍然与屏幕截图 2 中所示相同 我是 C Windows 窗体新手 如截图1所示 我有Form1有一些控件 每组控件都放在一个面板中 我在 PC1 中设计了应用程序
  • 具有多个谓词的 C++11 算法

    功能如std find if来自algorithmheader 确实很有用 但对我来说 一个严重的限制是我只能为每次调用使用 1 个谓词count if 例如给定一个像这样的容器std vector我想同时应用相同的迭代find if 多个
  • DataGridView 列中的数字文本框

    我有一个DataGridView 我想要它的第一列或任何所需的列 其中有textboxes在其中 成为NUMERIC ONLY 我目前正在使用这段代码 private void dataGridViewItems EditingContro
  • make_shared<>() 中的 WKWYL 优化是否会给某些多线程应用程序带来惩罚?

    前几天我偶然看到这个非常有趣的演示 http channel9 msdn com Events GoingNative GoingNative 2012 STL11 Magic Secrets作者 Stephan T Lavavej 其中提
  • PrivateObject 找不到属性

    我的结构基本上如下所示 abstract class A protected string Identificator get set private void DoSomething DoSomethingSpecific protect
  • 判断串口是普通COM还是SPP

    我正在寻找一种方法来确定 COM 是标准 COM 还是 SPP COM 也称为 COM 设备的电缆替换蓝牙适配器 我有一个可以在 USB COM gt USB 和蓝牙下工作的设备 并且蓝牙接口可以与 SPP 一起工作 我目前正在使用Syst
  • C 类型命名约定,_t 或 ALLCAPS

    我一直想知道是否有任何命名约定 例如何时对类型使用全部大写以及何时追加 t 什么时候不使用任何东西 我知道当时 K R 发布了各种有关如何使用 C 的文档 但我找不到任何相关内容 在 C 标准库类型中 t看起来漂亮占主导地位 time t
  • 如何增加ofstream的缓冲区大小

    我想增加 C 程序的缓冲区大小 以便它不会过于频繁地写入 默认缓冲区是 8192 字节 我尝试使用 pubsetbuf 将其增加到 200K 原始代码 ofstream fq fastq1 cstr ios out fastq1 is a
  • 如何在新窗口中打开图像或pdf文件?

    我有一个 gridview 它包含文件名和文件路径 图像和 pdf 格式文件 其中我使用了模板字段 在该字段下放置了 1 个图像按钮 单击该图像按钮 即 查看 按钮 时 我想在新窗口中打开所选文件 这是我的代码 protected void
  • MSChart 控件中的自定义 X/Y 网格线

    我有一个带有简单 2D 折线图的 C Windows 窗体 我想向其中添加自定义 X 或 Y 轴标记 并绘制自定义网格线 例如 以突出显示的颜色 虚线 我查看了 customLabels 属性 但这似乎覆盖了我仍然想显示的默认网格 这是为了
  • C 与 C++ 中的 JNI 调用不同?

    所以我有以下使用 Java 本机接口的 C 代码 但是我想将其转换为 C 但不知道如何转换 include
  • 使用 Unity 在 C# 中发送 http 请求

    如何使用 Unity 在 C 中发送 HTTP GET 和 POST 请求 我想要的是 在post请求中发送json数据 我使用Unity序列化器 所以不需要 新的 我只想在发布数据中传递一个字符串并且能够 将 ContentType 设置
  • 如何调用与现有方法同名的扩展方法? [复制]

    这个问题在这里已经有答案了 我有这样的代码 public class TestA public string ColA get set public string ColB get set public string ColC get se
  • 如何在 Razor 编辑视图中显示选中的单选按钮 Asp net core mvc

    尽管 Razor 视图中的 Asp 网络核心代码 model List

随机推荐

  • Spring源码学习之BeanDefinition源码解析

    本文作者 磊叔 GLMapper本文链接 https juejin cn post 6844903553820000269 Bean的定义主要由BeanDefinition来描述的 作为Spring中用于包装Bean的数据结构 今天就来看看
  • VMware虚拟化- 虚拟化与VMware的基础介绍

    1 什么是虚拟化 1 1 虚拟化概念 通俗的理解 如果你问 什么是虚拟化 我想大部分人的回答都会是 就是在一个操作系统中运行另一个操作系统 虽然这个答案也没错 但这并不是真正 虚拟化 的意义 只能说是虚拟化在硬件和操作系统之间的一个实践 事
  • 2023华为OD机试真题【计算敌人数量】

    题目描述 有一个大小是N M的战场地图 被墙壁 分隔成大小不同的区域 上下左右四个方向相邻的空地 属于同一个区域 只有空地上可能存在敌人 E 请求出地图上总共有多少区域里的敌人数小于K 输入描述 第一行输入为N M K N表示地图的行数 M
  • chromecast 协议_Chromecast和Android TV有什么区别?

    chromecast 协议 Google isn t particularly known for its clear branding This is certainly the case when it comes to Chromec
  • windows IPad 文件导入

    windows IPad 文件导入 首先下载iTunes Apple官网 itunes 打开软件 连接IPad 点击该按钮 点击文件共享和上传的软件 之后直接文件拖拽到右边的文档框里面
  • openwrt设置定时重启(天/周/月)

    1 进入openwrt管理页面 找到 系统 计划任务 编辑命令行 点击 保存 2 系统 启动项 中找到cron 确认状态为 开启 点击 重启 使计划生效 或重启系统 说明 一定要设置延时 防止无限重启 每天凌晨1点45分 延时70秒后自动重
  • Navicat for oracle创建数据库

    前言 其实在Oracle中的概念并不是创建数据库 而是创建一个表空间 然后再创建一个用户 设置该用户的默认表空间为我们新创建的表空间 这些操作之后 便和你之前用过的mysql数据库创建完数据库一模一样了 如果你用过mysql的话 当然如果O
  • 基于E-R模型的关系型数据库设计方法

    摘要 在管理信息系统开发中 数据库设计的目标是建立DBMS能识别的关系数据模型 而关系数据模型建立的基础是首先建立E R模型 通过E R模型才能转换为关系数据模型 如何建立E R模型以及如何将E R模型转换为关系数据模型 是管理信息系统开发
  • logback日志不打印到文件问题深入剖析

    详细探究logback不打印日志到文件的问题分析与案例演示 并提供官网bug的提交链接 环境与配置 问题 解决 原因 测试源码 测试结果 深入 线程出异常是否还会打印日志 环境与配置 使用maven构建的 引入logback依赖如下 注 其
  • vue2解决并实现页面刷新内容不变化

    前言 我们都知道 在vue中数据是响应式的 但是对于刷新的之后数据也会丢失 这就得借助于数据库存储 那么在vue中怎么去实现数据库的连接以及数据传输呢 下面我们来一起看一看 在之前我也在这个问题上困扰了很长时间 为了让大家都能看得懂 给大家
  • WPF之UI虚拟化

    在WPF应用程序开发过程中 大数据量的数据展现通常都要考虑性能问题 有下面一种常见的情况 原始数据源数据量很大 但是某一时刻数据容器中的可见元素个数是有限的 剩余大多数元素都处于不可见状态 如果一次性将所有的数据元素都渲染出来则会非常的消耗
  • neutron的DHCP错误之”sudo: unable to resolve host node-1\novs-vsctl:“

    问题背景 使用ESX创建虚拟机 并在虚拟机上创建一个三节点的openstack环境 参考官方的ICEHOUSE版本 注 ubuntu 14 04只支持到icehouse版 为加快虚拟机的创建时间 本文首先创建了一个控制节点c 1 并进行更新
  • pci无线配置服务器,PCI配置空间(中文).doc

    PCI Configuration 名词说明 PCI为Peripheral Component Interconnect 的缩写 它是由 Intel 所发表的另一种局部总线 另一种为 VESA Local Bus 以配合 Pentium 系
  • ACE_Proactor实现

    ACE Proactor实现了Facade模式 其方法可以分为四类 生命周期管理方法 事件循环管理方法 定时器管理方法 IO操作facilitator方法 须知ACE Proactor是使用Bridge模式的 ACE aynch Read
  • 内网安全-隧道搭建&穿透上线&FRP&NPS&Ngrok

    目录 环境介绍 内网穿透 Ngrok 入门 上线 tcp协议 内网穿透 Frp 简易型 上线 内网穿透 Nps 自定义 上线 环境介绍 实验目的 让msf上线外网 通常情况下 内网可以访问外网 但是外网无法访问到内网 所以外网的木马通常情况
  • 将二叉树转为有序的双向链表

    一 题目要求 输入一棵二叉排序树 现在要将该二叉排序树转换成一个有序的双向链表 而且在转换的过程中 不能创建任何新的结点 只能调整树中的结点指针的指向来实现 include
  • AHB to APB bridge

    目录 SPEC 验证框架图 测试点分解以及设计测试用例 测试点分解 设计测试用例 具体的Sequence及testcase Sequence testcase SPEC DUT如下 具体功能描述可参考ARM官方文档 AHB to APB s
  • 驾驭计算机视觉的翅膀:论文找代码的几种必杀技!

    摘要 对于CVer来说 代码和找代码 能力都是一种很重要的能力 毕竟idea再好只有通过代码实现出来才能发文章和刷榜 当我们阅读一篇高质量或者英文论文时 如何去找到该文章实现的代码 进而结合文章内容和代码实现去更好的理解作者所做的工作 只有
  • 什么是MVC设计模式

    直接上图 其中model 和view大家经常写 就不说了 有人可能并不清楚controller 到底是啥 其实就是经常写的 data source delegate outlet什么的 先撇开那些乱七八糟的箭头单看他们之间的分界线 view
  • C# 中BindingSource 的用法

    C BindingSource 1 引言 BindingSource组件是数据源和控件间的一座桥 同时提供了大量的API和Event供我们使用 使用这些API我们可以将Code与各种具体类型数据源进行解耦 使用这些Event我们可以洞察数据