Vb net 2016 datagridview cellvalidating Kannada sex chat examples

Rated 4.29/5 based on 943 customer reviews

All Cells);上面调用的 Auto Resize Columns 和 Auto Resize Column 当指定的是Data Grid View Auto Size Column Mode. Auto Resize Rows(Data Grid View Auto Size Rows Mode. Get Value() 方法来控制。 默认情况下,单元格的值的类型为object。当一个列被绑定后,会设置它的Value Type属性,它包含的单元格的Value Type也随之更新。而单元格的Value Type对于下一步的格式化非常重要。 格式化显示(Formatting for Display) 注意:当Data Grid View需要了解“如何显示这个单元格”时,它需要的是单元格的Formatted Value ,而不是Value。这是一个复杂的过程,因为格式化屏幕上的一些内容通常需要将它转换为字符串。例如,尽管你将单元格的值(Value)设置为整型值155,在显示它的时候仍需要将其格式化。单元格和其所在的列的Formatted Value Type 属性决定了显示它时所用的类型。多数列使用字符串类型,而Image和Check Box类型的单元格/列则使用其它类型。Image类型的单元格和列使用Image作为默认的Formatted Value Type,它的内置实现了解如何去显示一个Image。Check Box类型的单元格/列的Formatted Value Type属性则取决于属性Three State的值。在单元格级,所有这些由Data Grid View Cell. Error Icon); 或者,也可以让自己和油漆的细胞中添加一个自定义事件处理程序的Data Grid View. Row Post Paint前景的内容。您还可以禁用油漆和涂料的一切细胞在Data Grid View. Row Pre Paint自己的事件处理程序 5.3 Autosizing Data Grid View控件提供了自定义的列和行的调整大小行为的许多选项。通常情况下,Data Grid View单元格不调整的基础上的内容。相反,她们还会给任何显示值比电池大。如果内容可以作为一个字符串显示,该单元格显示在工具提示。 默认情况下,用户可以用鼠标拖动来显示更多信息行,列和标题分隔。用户还可以双击一个分频器来自动调整相关的行,列或标题带其内容为基础。列共享默认情况下,控制可用宽度?? Row Headers Width Size Mode 您还可以防止大小设置其Resizable属性由单个行或列的用户。默认情况下,Resizable属性值是基于对列Allow User To Resize Columns属性值和属性值的行Allow User To Resize Rows。如果你明确地设置大小可调整为True或False,但是,指定的值控制值覆盖该行或列中。设置调整大小to Not Set恢复继承。 由于Not Set还原值继承,Resizable属性永远不会返回Not Set值,除非该行或列并没有被添加到一个Data Grid View控制。如果您需要确定是否行或列Resizable属性值继承,审查其国家的财产。如果该国值包括Resizable Set标志,Resizable属性值不继承。 5.3.3自动调整大小 有两种自动调整大小在Data Grid View控制类型:列填充模式和基于内容的自动调整大小。 列填充模式导致在控件中可见列,以填补该控件的显示区域的宽度。如需这个模式的详细信息,请参阅列填充模式一节。 您还可以配置行,列和标题的大小自动调整以适应其单元格内容。在这种情况下,大小调整单元格内容时发生变化。 注意:如果你保持在自定义数据缓存单元格的值使用虚拟模式,自动调整大小时发生用户编辑单元格值,但不会发生改变时,外面的一Cell Value Pushed事件处理缓存值。在这种情况下,调用Update Cell Value方法强制控制更新单元格的显示和应用当前的自动调整大小模式。 如果基于内容的自动调整大小仅用于也就是说,对于行,但不列,或列,但不是行和的Wrap Mode还启用一维启用,大小调整时,也会发生在其他方面的变化。例如,如果行,但不列自动调整大小和配置的Wrap Mode已启用,用户可以拖动列分隔来改变一个列和行高将自动调整使细胞内容仍然充分显示宽度。 如果配置基于内容的自动调整大小行和列和的Wrap Mode启用,Data Grid View控件将调整单元格内容改变大小时,将使用一个理想的细胞高度对宽度的比例,当计算新的大小。 要配置标题和行和列不会覆盖控制值,浆纱模式设置一个或多个以下的Data Grid View属性: ? 避免使用带有大量行集的Data Grid View控制自动调整大小。如果你使用自动大小调整,只调整的基础上所显示的行。在虚拟模式下只使用所显示的行以及。 对行和列? 对于行头,使用该Data Grid View Row Headers Width Size Mode枚举Auto Size To Displayed Headers或Auto Size To First Header领域。 为了获得最大的可扩展性? 该行包含其项目属性的Data Grid View Combo Box Cell集。 在绑定模式或虚拟模式,您可以通过处理Cell Tool Tip Text Needed提供Cell Context Menu Strip Needed事件和个别细胞工具提示和快捷菜单。 Data Grid View控件将自动尝试使用共享每当行添加到Data Grid View Row Collection行。使用下面的指引,以确保行共享: ? 避免索引中的行集或通过它迭代与foreach循环。你不会通常需要直接访问行。 Data Grid View的操作方法,对行,而不是采取行实例行索引参数。此外,对于行相关的事件处理程序接收行属性,您可以用它来操作,而不会造成他们成为非共享行的事件参数对象。 ? 避免细胞为基础的选择模式。这些模式导致行成为非共享。相反,将Selection Mode属性设置Data Grid View Selection Mode. 不要调用Are All Cells Selected(布尔)方法。这种方法可能会导致行成为非共享。 ? 不要调用Select All方法当Selection Mode属性值是Cell Select。这会导致所有行成为非共享。 ?

All Cells); //让 Data Grid View1 的第一行的行高自动调整一下。 Data Grid View1. Display Member = "Stu Name"; ------------- 让Data Grid View的列宽自适应 就一行代码: Columns[i]. Get Formatted Value()控制。 默认情况下,Data Grid View使用Type Converter将单元格的值(Value)转换为格式化的值(Formatted Value)。Data Grid View会基于单元格的Value Type和Formatted Value Type属性来获取合时的Type Converter。 对于一个单元格,Formatted Value会得到多次请求(即会在多个地方用到):绘制单元格的时候,所在列根据单元格内容自动调整大小的时候,甚至是在判断鼠标是否经过单元格内容时。每次需要Formatted Value的时候,Data Grid View会触发Cell Formatting事件,这时你就有机会修改单元格的格式化显示了。 如果单元格不能获取它的格式化值,它会触发Data Error事件。 格式化显示单元格还包含以怎样的首选尺寸显示它。这个首选尺寸是由单元格的Formatted Value,填充区域(padding),附加显示和边框合并而成。 绘制单元格的显示(Painting the Display) 在获得Formatted Value 后,单元格将负责绘制它的内容。单元格决定了绘制过程所使用的正确样式(参见本文档第五章的样式部分)并进行绘制。记住:如果单元格不去绘制自己,那么该单元格将不会有任何内容得到绘制(即单元格的绘制只由它自己负责),行、列不会负责绘制任何内容,因此要确保至少要绘制单元格的背景(background),否则单元格所在的矩形区域仍然是无效的(即未经绘制)。 解析单元格的显示(Parsing the Display) 用户开始与单元格交互后,可能会编辑单元格的值。有一件事要记住,用户编辑的实际上是单元格的Formatted Value。用户提交所编辑的值时,Formatted Value需要转换回单元格的值(Value),这个过程称为解析(parsing)。在单元格级上,所有这些工作由单元格的Data Grid View Cell. ,所以,如果用户可以调整控制,例如,如果它是一个可调整大小的对接形式,他们也可以更改列的所有可用的展示空间。 Data Grid View控件提供的属性,方法和事件,使您可以自定义或禁用这些用户导向的所有行为。此外,您可以通过编程方式调整行,列和标题,以适合他们的内容,也可以将其配置为自动调整自己只要其内容的变化。 常见问题: 1)如何调整最后一列的宽度使其占据网格的剩余客户区? 5.3.1在Windows窗体Data Grid View控件调整大小选项 Data Grid View行,列和标题可以改变许多不同的事件结果的大小。下表显示了这些事件。 发生说明 用户调整大小用户可以通过拖动或双击行,列或标题分隔大小的调整。 控制调整在列填充模式,列宽度变化时,控制宽度的改变,例如,当控件停靠到其父形式和用户调整的表格。 细胞在基于内容的自动调整大小模式值的变化,大小变化,以适应新的显示值。 方法调用的方案内容为基础的大小可以让用户调整大小的基础上伺机在方法调用时单元格值。 属性设置也可以设置特定的高度和宽度值。 默认情况下,启用用户调整大小,自动调整大小被禁用,是更广泛的单元格值比列剪裁。 下表显示的情况,你可以用它来调整预设的行为,或使用特定的调整大小选项来达到特定的效果。 方案实施 使用列填充显示同样,在一列,占据了整个宽度的控制数量相对较少,而不显示水平滚动条大小的数据模式。 Auto Size Columns Mode属性设置为Fill。 使用列填充不同大小显示值模式。 Auto Size Columns Mode属性设置为Fill。初始化设置列的Fill Weight属性或调用控件Auto Resize Columns灌装后用数据控制方法相对列宽度。 使用列填充不同的重要性与价值模式。 Auto Size Columns Mode属性设置为Fill。设置大量列的Minimum Width值,必须始终显示的数据部分或使用一个尺寸的选择以外填补特定列模式。 使用列填充模式,以避免显示控件的背景。设置最后一列Auto Size Mode属性为Fill和使用其他尺寸的其他列选项。 显示一个固定宽度的列,如图标或ID列。 Auto Size Mode设置为None,可调整大小为False的列。初始化设置width属性,或者调用控件Auto Resize Column后用数据填?? ,关闭自动调整大小尺寸和使用方案。 6.4使用选定的单元格,行和列的集合高效 Selected Cells集合不执行效率大选择。收藏的Selected Rows和Selected Columns也可以是低效的,但在较小的程度,因为有许多比细胞中的行数少一个典型的Data Grid View控件,比列行少得多。为了避免性能下降与这些藏品时,请遵循下列准则: ? 避免细胞为基础的选择模式。相反,Selection Mode属性设置为Full Row Select或Full Column Select。 6.5使用共享行 实现有效的内存使用在通过共享行的Data Grid View控制。作为行会分享他们的外观和行为,尽可能通过Data Grid View Row类的共享实例的信息。 虽然共享行实例节省内存,很容易成为非共享行。例如,每当一个直接与用户交互的一个单元,它的行成为非共享。因为这是无法避免,在这个主题中的准则是有用的,只有当工作与数据量非常大,只有当用户将与每一个数据你的程序运行时间的一小部分。 阿行不能共享在未绑定的Data Grid View控制,如果它的任何单元格包含值。当Data Grid View控件绑定到外部数据源,或当您实现虚拟模式,并提供您自己的数据源,该单元格值存储以外的控制,而不是在单元格对象,允许行被共享。 行对象只能共享,如果它的所有细胞的状态可以从该行的状态和细胞列载的状态决定。如果您更改单元格的状态,这样它可以不再从它的行和列的状态推断,该行不能被共享。 例如,行不能共享在下列情形之一: ? 避免调用Add(Object []的)的添加方法和插入(对象[])的插入的行的集合方法重载超载。这些重载自动创建非共享行。 ?

Frozen 属性为 True 时, 该列左侧的所有列被固定, 横向滚动时固定列不随滚动条滚动而左右移动。这对于重要列固定显示很有用。 // Data Grid View1的左侧2列固定 Data Grid View1. Frozen 属性为 True 时, 该行上面的所有行被固定, 纵向滚动时固定行不随滚动条滚动而上下移动。 // Data Grid View1 的上3行固定 Data Grid View1. Frozen = true; Data Grid View 列顺序的调整 设定 Data Grid View 的 Allow User To Order Columns 为 True 的时候, 用户可以自由调整列的顺序。 当用户改变列的顺序的时候,其本身的 Index 不会改变,但是 Display Index 改变了。你也可以通过程序改变 Display Index 来改变列的顺序。 列顺序发生改变时会引发 Column Display Index Changed 事件: // Data Grid View1的Column Display Index Changed事件处理方法 private void Data Grid View1_Column Display Index Changed(object sender, Data Grid View Column Event Args e) Data Grid View 新加行的默认值的设定 需要指定新加行的默认值的时候,可以在Data Grid View. Clipboard Copy Mode 属性被设定为 Data Grid View Clipboard Copy Mode. NET,新加的行会被自动排序至合适的位置。 4.1.3.7 关于新行,还要注意: 你不能将新行的Visible属性值设置为false,否则会触发一个Invalid Operation Exception类型的异常。 新行在创建时总是处于非选中(unselected)状态。 4.1.3.8 Virtual Mode下的新行 如果你正要实现虚拟模式(Virtual Mode),需要考虑数据模型添加新行和回滚添加操作的情况。该功能准确的实现方式取决于数据模型的实现方式及其事务机制,例如,提交的时候是针对单元格还是行。参看本文档后面关于Virtual Mode的主题。 4.2 关于Null值 在使用数据源的时候,比如数据库或业务对象,经常需要处理null值。null值可能是一个实际的null(VB中为Nothing),也可能是一个数据库的”null”值(DBNull.

Default Values Needed事件里处理。在该事件中处理除了可以设定默认值以外,还可以指定某些特定的单元格的Read Only属性等。 // Default Values Needed 事件处理方法 private void Data Grid View1_Default Values Needed(object sender, Data Grid View Row Event Args e) 三、针对datagridview全局属性的设置 使用 Edit Mode 属性 Data Grid View. Edit Programmatically 时,用户就不能手动编辑单元格的内容了。但是可以通过程序,调用 Data Grid View. Disable 以外的情况时,「Ctrl C」 按下的时候,被选择的单元格的内容会拷贝到系统剪切板内。格式有: Text, Unicode Text,Html, Comma Separated Value。可以直接粘贴到 Excel 内。 Clipboard Copy Mode 还可以设定 Header部分是否拷贝: Enable Always Include Header Text 拷贝Header部分、Enable Without Header Text 则不拷贝。默认是 Enable With Auto Header Text , Header 如果选择了的话,就拷贝。 1) 编程方式实现剪切板的拷贝 Clipboard. Get Clipboard Content()) 2) Data Grid View 的数据粘贴 实现剪切板的拷贝比较容易,但是实现 Data Grid View 的直接粘贴就比较难了。「Ctrl V」按下进行粘贴时,Data Grid View 没有提供方法,只能自己实现。 以下,是粘贴时简单的事例代码,将拷贝数据粘贴到以选择单元格开始的区域内。 //当前单元格是否选择的判断 if (Data Grid View1. Trim End(new char[] ); string[] lines = paste Text. Context Menu Strip2; // 列头的 Context Menu Strip 设定 Data Grid View1. Value),当你遭遇了这些值,就需要考虑如何显示它们。另一方面,很多时候,你还需要向数据源写入null值。使用单元格Style的Null Value属性和Data Source Null Value 属性,你可以改变Data Grid View处理null值的方式。 4.2.1 Null Value属性 Data Grid View Cell Style. Empty (“”) Check Box Column 默认值取决于Three State属性的值,如果为true,默认值为Check State.

如果希望,Data Grid View 内所有单元格都不可编辑, 那么只要: // 设置 Data Grid View1 为只读 Data Grid View1. Value = "第一行"; // 改变Data Grid View1的左上头部单元内容 Data Grid View1. Value = "左上"; 另外你也可以通过 Header Text 来改变他们的内容。 // 改变Data Grid View1的第一列列头内容 Data Grid View1. Header Text = "第一列"; Data Grid View 单元格的Tool Tip的设置 Data Grid View.

Current Cell Address 属性(而不是直接访问单元格)来确定单元格所在的行: Data Grid View. * 注意: Grid View 的索引器的参数是: column Index, row Index 或是 column Name, row Index 这与习惯不同。 ********Data Grid View 设定单元格只读: 1) 使用 Read Only 属性 ?

Cell Border Style 属性来设定的。 Cell Border Style 属性设定值是 Data Grid View Cell Border Style 枚举。(详细参见 MSDN) 另外,通过 Data Grid View. Right = _ Data Grid View Advanced Cell Border Style. Cell Parsing 事件可以设定用户输入的值。下面的示例:当输入英文文本内容的时候,立即被改变为大写。 //Cell Parsing 事件处理方法 private void Data Grid View1_Cell Parsing(object sender, Data Grid View Cell Parsing Event Args e) 二、行/列的操作 Data Grid View 不显示最下面的新行: 通常 Data Grid View 的最下面一行是用户新追加的行(行头显示 * )。如果不想让用户新追加行即不想显示该新行,可以将 Data Grid View 对象的 Allow User To Add Rows 属性设置为 False。 // 设置用户不能手动给 Data Grid View1 添加新行 Data Grid View1.

Current Cell == null) return; int insert Row Index = Data Grid View1. Row Index; // 获取剪切板的内容,并按行分割 string paste Text = Clipboard. Is Null Or Empty(paste Text)) return; paste Text = paste Text. Split(' '); bool is Header = true; foreach (string line in lines) Data Grid View 的右键菜单(Context Menu Strip) Data Grid View, Data Grid View Column, Data Grid View Row, Data Grid View Cell 有 Context Menu Strip 属性。可以通过设定 Context Menu Strip 对象来控制 Data Grid View 的右键菜单的显示。 Data Grid View Column 的 Context Menu Strip 属性设定了 除了列头以外的单元格的右键菜单。 Data Grid View Row 的 Context Menu Strip 属性设定了除了行头以外的单元格的右键菜单。Data Grid View Cell 的 Context Menu Strip 属性设定了指定单元格的右键菜单。 // Data Grid View 的 Context Menu Strip 设定 Data Grid View1. Context Menu Strip1; // 列的 Context Menu Strip 设定 Data Grid View1. Null Value 属性本来要被命名为Formatted Null Value 的,但是后来没来得及作出这个更改。但它能给我们带来一点提示——顾名思义,在格式化时会用到它。如果一个单元格的值为”null”(等于null或DBNull. Value),它会使用你设置的Null Value属性来显示。该属性的默认值取决于所在列的类型,见下图: Data Grid View列类型 列的Default Cell Style. Empty (“”) Image Column 空的图像( ) Combo Box Column String. Indeterminate ,否则为unchecked。 有一点要了解,在用户输入数据时也会用到Null Value。例如,若用户向Text Box类型单元格输入了string. Empty,那么会将null作为该单元格的值。 查看下面的Data Source Null Value属性以了解究竟是输入了什么作为单元格的值。 4.2.2 Data Source Null Value属性 Data Grid View Cell Style. Red值是第一个在名单上的实际价值。这成为该单元格的Inherited Style Fore Color属性值。 下图说明了不同的Data Grid View Cell Style属性可以继承他们的价值观不同的地方。 通过利用样式继承的优势,可以提供,而无需指定相同的信息在多个地方为整个控制适当的样式。 虽然标题单元格样式继承中所描述的身份参加,由Data Grid View控件的Column Headers Default Cell Style和Row Headers Default Cell Style属性返回的对象具有初始属性值覆盖由Default Cell Style属性返回的对象的属性值。如果你想由Default Cell Style属性返回的对象设置为适用于行和列标题的属性,你必须设置由Column Headers Default Cell Style和Row Headers Default Cell Style属性返回的Data Grid View Cell Style类为默认显示对象的相应属性。 注:如果启用视觉样式,行和列标题(除Top Left Header Cell)会自动由当前的主题风格,覆盖了这些属性所指定的任何样式。设置Enable Headers Visual Style属性为false,如果你想标题不使用XP的视觉样式。 该Data Grid View Button Column,Data Grid View Image Column和Data Grid View Check Box Column类型还初始化由列Default Cell Style属性返回的对象的一些值。有关详细信息,请参见这些类型的参考文件。 5.1.4设置样式动态 要自定义,特别值的单元格的样式,实施一项Cell Formatting事件的处理程序。此事件的处理程序收到的Data Grid View Cell Formatting Event Args类型的参数。此对象包含的属性,让您确定单元格的值被格式化,其在Data Grid View控制地沿。此对象还包含一个Cell Style属性,初始化为单元格的Inherited Style属性值被格式化。您可以修改单元格样式属性来指定样式的信息适合单元格的值和位置。 注:Row Pre Paint和Row Post Paint事件还接收事件数据的Data Grid View Cell Style对象,但他们的案件,这是该行Inherited Style属性为只读目的副本,以及它的变更不会影响控制。 您还可以动态改变以因应如Cell Mouse Enter和Cell Mouse Leave活动活动单个细胞的风格。例如,在为Cell Mouse Enter事件处理程序中,你可以存储单元格的背景颜色(通过细胞的Style属性检索)的当前值,然后将其设置为一个新的色彩,将突出显示单元格时在它的鼠标悬停。在为Cell Mouse Leave事件处理程序,然后就可以恢复到原来的背景颜色值。 注:缓存在细胞的Style属性中存储的值是重要的,无论是否设置特定的样式值。如果您暂时替换样式设置,恢复到原来的“未设置”国家保障,细胞会返回从更高的层次继承的样式设置。如果您需要确定在一个单元的实际效果风格的风格无论是继承,使用单元格的Inherited Style属性。 5.2风俗画 Data Grid View控件提供了多个属性,您可以用它来调整外观和基本行为(外观和感觉)的单元格,行和列。如果您有要求,超越的Data Grid View Cell Style类的功能的时候,你可以执行单元格或行的内容自定义绘制。单元格和行画自己,你可以处理各种如Row Pre Paint的Data Grid View,Cell Painting和Row Post Paint绘画活动。 5.2.1油漆件 自定义绘制的一个重要部分是油漆部件的概念。该Data Grid View Pain Parts枚举用于指定哪些部分细胞油漆。枚举值可结合在一起,有一个单元不油漆涂料或特定部分。这里是不同的部分: Paint Part为例前景色为检索对象的价值 所有的所有部件都画 背景单元格的背景是画使用单元格的背景颜色(1) 边境的边界是画 Content Background单元格的内容是画背景的一部分。 (2) Content Foreground单元格的内容的前景部分是画(2) Error Icon错误图标画 重点加强对单元格焦点矩形画 没有任何部分是画(1) Selection Background画的背景是,如果选中该单元格被选中。 注释 1)如果一个单元格不绘制其背景则没有什么是画。一个行或列执行任何作画,确保至少细胞的背景画,或者您执行您自己的自定义背景画,否则仍然是无效的矩形(着色)。 2)每个单元确定什么前景为内容的背景和内容,如下面的列表描述的那样涂料: 细胞类型的内容前景内容背景 文本框单元格的文字是画没有画 扣式电池文字画,画按钮 组合框单元格的文字是画,画组合框 选中复选框是画没有画 链接单元格文本链接是没有画成画 图像细胞图像是画没有画 标题栏标题栏文字排序雕画 行头行头文字Current行三角形,编辑铅笔和新行的指标是画 5.2.2行预油漆涂料和邮政业 您可以通过处理一个或Data Grid View. Row Post Paint两个事件的Data Grid View行的外观。这些活动的设计,让你可以画只有你想在Data Grid View控制,而让其余的油漆。例如,如果你想画一个自定义的背景,你可以处理Data Grid View.

Data Source Null Value属性要被命名为Parse Null Value的,如果Null Value属性被命名为Formatted Null Value的话,但最后还是采用了Data Source Null Value,这样更直观准确。在将null值写入单元格的值时,就会用到Data Source Null Value属性。在数据绑定情形下,这个null值将被写入数据库或业务对象,此处需要进行控制,因为对于数据库和业务对象来说,null的概念不尽相同。通常你会期望,使用业务对象时将Data Source Null Value 设置为null,而使用数据库时则将其设置为DBNull Value。Data Source Null Value的默认值为DBNull. Row Pre Paint事件,并让自己的单个细胞涂料前景的内容。在Row Pre Paint事件你可以设置Paint Parts事件参数属性来轻松定制的细胞如何油漆。例如,如果您想保留的任何选择,或从绘画的焦点细胞,你Row Pre Paint事件将设置像这样Paint Parts属性: e.

Auto Size Columns Mode = Data Grid View Auto Size Columns Mode. ntal Scroll Bar和Vertical Scroll Bar属性显示。 Scroll Bar控件直接访问这些让你拥有滚动更好的控制。 5.5.3滚动属性 有许多的属性,提供更大的详细程度如何设??

Enable Resizing; Data Grid View 列宽和行高自动调整的设定: // 设定包括Header和所有单元格的列宽自动调整 Data Grid View1. Selected。 5.5滚动(滚动) Data Grid View中毫无疑问地会提供对水平和垂直滚动条的支持,它同时也支持使用鼠标滚轮进行垂直滚动。水平方向的滚动基于像素值,而垂直方向的滚动则基于行的索引,不支持垂直的Data Grid View方向的基于像素值的滚动。 5.5.1 Scroll事件 当你滚动Data Grid View的引发Scroll事件,让您被通知滚动发生。对滚动事件参数定位属性可以让你知道滚动的方向。 5.5.2滚动条 Data Grid View的滚动条可以访问,它通过保护Horizo??

Leave a Reply