Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Visual Basic

Dim Col As New C1.Win.C1TrueDBGrid.C1DataColumn Dim dc As C1.Win.C1TrueDBGrid.C1DisplayColumn

With Me.C1TrueDBGrid1
.Columns.Insert(0, Col) Col.Caption = "Unbound" dc = .Splits(0).DisplayColumns.Item("Unbound")

' 移除网格最左侧的新加入的列。
.Splits(0).DisplayColumns.RemoveAt(.Splits(0).DisplayColumns.IndexOf(dc)) .Splits(0).DisplayColumns.Insert(0, dc) dc.Visible = True .Rebind(True)
End With

To write code in C#

C#

<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="23a26fe5-eed1-47c6-b4a7-bdc3378435f6"><ac:plain-text-body><![CDATA[

C1.Win.C1TrueDBGrid.C1DataColumn Col = new C1.Win.C1TrueDBGrid.C1DataColumn();

C1.Win.C1TrueDBGrid.C1DisplayColumn dc;

c1TrueDBGrid1.Columns.Insert(0, Col);

Col.Caption = "Unbound";

dc = c1TrueDBGrid1.Splits[0].DisplayColumns["Unbound"];

]]></ac:plain-text-body></ac:structured-macro>


Wiki Markup
<span style="color: #008000">//  移除网格最左侧的新加入的列。</span>
c1TrueDBGrid1.Splits\[0\].DisplayColumns.RemoveAt(C1TrueDBGrid1.Splits\[0\].DisplayColumns.IndexOf(dc)); c1TrueDBGrid1.Splits\[0\].DisplayColumns.Insert(0, dc); dc.Visible = true; c1TrueDBGrid1.Rebind(true);
当网格需要显示非绑定列中的值,它将触发{*}UnboundColumnFetch{*}事件,该事件提供给用户行和列的索引,用以识别所请求的网格中的单元格,事件的{*}Value{*}属性是类型对象,默认值为Null,但可以更改为任何所需的值,并将用于填充指定行和列索引单元格的内容。
*To write code in Visual Basic*

...

Visual Basic

Private Sub C1TrueDBGrid1_UnboundColumnFetch(ByVal sender As Object, ByVal e As
C1.Win.C1TrueDBGrid.UnboundColumnFetchEventArgs) Handles C1TrueDBGrid1.UnboundColumnFetch

To write code in C#

C#

private void c1TrueDBGrid1_UnboundColumnFetch(object sender,
C1.Win.C1TrueDBGrid.UnboundColumnFetchEventArgs e)

 实现多非绑定列

目前,我们的示例仅使用一个单独的非绑定列演示UnboundColumnFetch 事件,但仅使用了一个非绑定列,由于 UnboundColumnFetch触发了每个非绑定列的每一行,只要一个列值某时被设置,每一列就必须确定一个合适的值,第二个UnboundColumnFetch属性Column被用于识别网格中的列,其值是必须的。
To write code in Visual Basic

...


To write code in C#

C#

// 将用作拷贝。
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="f80a33cb-80ee-431b-a257-020bf2416e60"><ac:plain-text-body><![CDATA[ Data.DataTable dtCopy;

private void Form1_Load( System.object sender, System.EventArgs e)

{ dtCopy = this.DataSet11.Tables[0].Copy(); }
]]></ac:plain-text-body></ac:structured-macro>

private void C1TrueDBGrid1_UnboundColumnFetch(object sender,
C1.Win.C1TrueDBGrid.UnboundColumnFetchEventArgs e)

{

switch (e.Column.Caption(眨眼) Caption)

{ case "Area";
// 计算网格中"Area"列值。
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="63b1562f-75af-41b2-806c-0f5df46df168"><ac:plain-text-body><![CDATA[ e.value = dtCopy.Rows[e.Row].Item["Length"] * dtCopy.Rows[e.Row].Item["Width"];

break;

case "Perimeter";
]]><
/ac:plain-text-body></ ac:structured-macro>
// 计算网格中"Perimeter"的列值。
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="dc2b289a-4d7c-4f34-acaf-830c9432e3af"><ac:plain-text-body><![CDATA[ e.value = 2 * (dtCopy.Rows[e.Row].Item["Length"] + dtCopy.Rows[e.Row].Item["Width"]);

break;

}
]]></ac:plain-text-body></ac:structured-macro>

}

 更新非绑定列

在大多数情况下,非绑定列是只读的,并作为源自网格中其他数据的值,在这些情况下,设置列样式的Locked 属性为True
LockedFalse 且更新被允许,用户可以编辑非绑定列的值,当编辑非绑定列值时,行被标记为已更新(在记录选择器列中将显示一个铅笔图标)并且更新序列将照常执行,然而网格并不了解修改后的数据将如何处理,因此不需要数据库字段来保存它,在这种情况下,UnboundColumnUpdated 事件将被触发。
BeforeUpdate 事件将用来取消更新操作,因此,如果非绑定列与其他数据库绑定,则非绑定列的更新将在
BeforeUpdate中执行,如果操作失败,那么事件将被取消,但如果操作成功了,绑定更新将被允许继续,绑定更新也有可能在这时失败,因此非绑定列的数据库关联最好在事务基础上被处理。
如果绑定更新成功了,则AfterUpdate 事件将被触发,并且非绑定列事务应该被确认,如果绑定更新失败,非绑定列事务应将在 .NET的错误捕捉处理中回滚,依赖于更新初始化的状态,如果事务不可用,此时将之前非绑定原始列值存储到更新中,执行其他更新来存储绑定更新失败的这些值。

...

C#

private void C1TrueDBGrid1_AfterColUpdate(object sender,
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="6e89329c-9f20-47f1-bef8-c7c61ab85c4e"><ac:plain-text-body><![CDATA[ C1.Win.C1TrueDBGrid.ColEventArgs e)

{

int row = this.c1TrueDBGrid1.Row;

this.c1TrueDBGrid1[row, "Balance"] = -e.Column.DataColumn.Value;
]]></ac:plain-text-body></ac:structured-macro>

}

注意,当更新这些列时,代码事实上改变了Balance 列中的值,包括绑定的和不可见的值。

...

To write code in Visual Basic

Visual Basic

Me.C1TrueDBGrid1.SetDataBinding()

To write code in C#

C#

this.c1TrueDBGrid1.SetDataBinding();

  1. 使用AddRowAddRows 方法填充网格。

To write code in Visual Basic

Visual Basic

Me.C1TrueDBGrid1.AddRow("John;Doe;11/29/1985")
Me.C1TrueDBGrid1.AddRow("Jane;Doe;7/12/1980")

Dim index As Integer = Me.C1TrueDBGrid1.AddRows(2)
Dim i As Integer
For i = index To 1
Me.C1TrueDBGrid1(i, "FirstName") = "Joe"
Me.C1TrueDBGrid1(i, "LastName") = "Doe"
Me.C1TrueDBGrid1(i, "DateOfBirth") = New DateTime(2000, 1, 15)
Next i

To write code in C#

C#

this.c1TrueDBGrid1.AddRow("John;Doe;11/29/1985"); this.c1TrueDBGrid1.AddRow("Jane;Doe;7/12/1980"); int index = this.c1TrueDBGrid1.AddRows(2); for(int i=index; i < 2; i++)

...

C#

private void button1_Click(object sender, EventArgs e) { int idx = (int) this.numericUpDown1.Value;
// 创建一个新行。 <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="23aedbc3-3f72-4f49-8a97-f002ed6fc0b0"><ac:plain-text-body><![CDATA[

DataRow dr = this.c1TrueDBGrid1.NewRow();

dr[0] = "new row";
]]></ac:plain-text-body></ ac:structured-macro>
// 在选择的索引中添加新行。
this.c1TrueDBGrid1.Rows.InsertAt(dr, idx);
}

...