Previous topicNext topic
Help > 开发指南 > 预备知识 >
如何引用列

如何正确处理对应列数据,所以这里我们来介绍一下在我们平台中如何在各种场景下引用行数据。

首先我们要知道我们平台中有哪些行。

1、Column:全路径为C1.Win.C1FlexGrid.Column。属于SmGrid.Cols下的项,获得方式:SmGrid.Cols("列名称")。

2、DataColumn:全路径为System.Data.DataRow。属于DataTable.Columns下的项,获得方式:SmGrid.DataTableHelp.DataTable.Columns("列名称")。

3、ColData:全路径为sanMuSoft.Data.ColData。属于DataTableHelp.DataCols下的项,获得方式:SmGrid.DataTableHelp.DataCols("列名称")。

4、ViewCol:全路径为sanMuSoft.CS.WinForm。属于SmGrid.View.ViewCols下的项,获得方式:SmGrid.View.ViewCols("列名称")。

这四种列基本上可以通过列名称来实现这四种对象的指定列引用。具体的示例也可以参考“如何引用行”中的第6条:在事件中获取当前行列。

获取列的方法

由于获取列的基本方式比较简单,我们只需要知道列名称,即可通过上面的方式获得所需要的列对象了。所以下面我们多以获得列名称为标准。

1、获取当前列。我们这里说的当前列指的就是当我们在表中随便点击一个单元格或者选中一片区域,总一个激活的单元格,这个单元格的那一列,我们称之为当前列。SmGrid中有一个属性Col,就是获得这个当前激活单元格的列序号的,所以我们可以通过此属性来获得当前列的名称:

 Vb.Net
Dim tbl As SmGrid=Proj.CurrentSmGrid
Dim strColName As String=tbl.Cols(tbl.Col).Name

 C#
SmGrid tbl = Proj.CurrentSmGrid;
string strColName = tbl.Cols[tbl.Col].Name;

2、获得一些特殊列。除了当前列外,我们还会碰到一些特殊列的获取

a.第一列:SmGrid.Cols.Fixed属性可以获得当前表中有几列行标题,而我们的列序号是从0开始的,所以通过此属性我们就可以直接获得表的第一列名称。tbl.Cols(tbl.Cols.Fixed).Name

b.最后一列:SmGrid.Cols.Count属性可以获得当前表中所有列的数量,而获得最后一列名称我们就可以通过以下方式获得:tbl.Cols(tbl.Cols.Count-1).Name

c.鼠标右击时,我们可以通过SmGrid.MouseCol属性可以获得当前鼠标的光标所在的列,所以我们可以获得右击鼠标时(右键菜单弹出时)鼠标的光标所在列名:tbl.Cols(tbl.MouseCol).Name

3、遍历表的选择区域

 VB.Net
'先定义变量获取表
Dim tbl As SmGrid = Proj.CurrentSmGrid
tbl.StopRedraw()
'获取当前表的当前选择区域
Dim rng As CellRange = tbl.Selection

Try
    '遍历选择区域的每一列
    For j As Integer = rng.c1 To rng.c2
        '如果当前列允许编辑并且没有禁用当前表中编辑
        If tbl.Cols(j).AllowEditing AndAlso Not tbl.View.ViewCols(tbl.Cols(j).Name).OnlyDisableEditInGrid Then
            '遍历选择区域的每一行
            For i As Integer = rng.r1 To rng.r2
                '如果指定行没有绑定数据或者当前行没有被锁定,则继续清除操作
                If tbl.Rows(i).GetRowData() Is Nothing OrElse Not tbl.Rows(i).GetRowData().Locked Then
                    '将指定单元格赋值为空,即消除数据
                    tbl.SetData(i, j, DBNull.Value)
                End If
            Next
        End If
    Next
    
Catch ex As Exception
    UnhandledExceptionManager.ShowAndSaveLog(ex)
Finally
    tbl.ResumeRedraw()
End Try

C#
//先定义变量获取表
SmGrid tbl=Proj.CurrentSmGrid;
tbl.StopRedraw();
//获取当前表的当前选择区域
CellRange rng = tbl.Selection;
try
{
    //遍历选择区域的每一列
    for (int j = rng.c1; j <= rng.c2; j++)
    {
        //如果当前列允许编辑并且没有禁用当前表中编辑
        if (tbl.Cols[j].AllowEditing && !tbl.View.ViewCols[tbl.Cols[j].Name].OnlyDisableEditInGrid)
        {
            //遍历选择区域的每一行
            for (int i = rng.r1; i <= rng.r2; i++)
            {
                //如果指定行没有绑定数据或者当前行没有被锁定,则继续清除操作
                if (tbl.Rows[i].GetRowData()==null || !tbl.Rows[i].GetRowData().Locked)
                {
                    //将指定单元格赋值为空,即消除数据
                    tbl.SetData(i, j, DBNull.Value);
                }
            }
        }
    }
}
catch (Exception ex)
{
    UnhandledExceptionManager.ShowAndSaveLog(ex);
}
finally
{
    tbl.ResumeRedraw();
}

4、在SmGrid中遍历列

 Vb.Net
Dim tbl As SmGrid=Proj.CurrentSmGrid
'直接循环遍历
For Each tc As Column In tbl.Cols
    If tc.Name="目标列" Then
        MessageBox.Show("找到了!")
    End If
Next

'可以根据序列来获得列的引用,注意tbl.Cols.Fixed是表示我们排序左边行标题列,从真正的数据列开始
For i As Integer = tbl.Cols.Fixed To tbl.Cols.Count-1
    If tbl.Cols(i).Name="目标列" Then
        MessageBox.Show("找到了!")
    End If
Next

 C#
SmGrid tbl = Proj.CurrentSmGrid;
// 直接循环遍历
foreach (Column tc in tbl.Cols)
{
    if (tc.Name == "目标列")
    {
        MessageBox.Show("找到了!");
    }
}

// 可以根据序列来获得列的引用,注意tbl.Cols.Fixed是表示我们排序左边行标题列,从真正的数据列开始
for (int i = tbl.Cols.Fixed; i <= tbl.Cols.Count - 1; i++)
{
    if (tbl.Cols[i].Name == "目标列")
    {
        MessageBox.Show("找到了!");
    }
}

5、遍历ViewCol列

 Vb.Net
Dim tbl As SmGrid=Proj.CurrentSmGrid
'直接循环遍历
For Each tc As ViewCol In tbl.View.ViewCols
    If tc.Name="目标列" Then
        MessageBox.Show("找到了!")
    End If
Next

 C#
SmGrid tbl = Proj.CurrentSmGrid;
// 直接循环遍历
foreach (ViewCol tc in tbl.View.ViewCols)
{
    if (tc.Name == "目标列")
    {
        MessageBox.Show("找到了!");
    }
}

6、遍历ColData列

 Vb.Net
Dim tbl As SmGrid=Proj.CurrentSmGrid
'直接循环遍历
For Each tc As ColData In tbl.DataTableHelp.DataCols
    If tc.Name="目标列" Then
        MessageBox.Show("找到了!")
    End If
Next

 C#
SmGrid tbl = Proj.CurrentSmGrid;
// 直接循环遍历
foreach (ColData tc in tbl.DataTableHelp.DataCols)
{
    if (tc.Name == "目标列")
    {
        MessageBox.Show("找到了!");
    }
}

7、遍历DataColumn列。注意,DataColumn的列名称是通过ColumnName属性返回的。

 Vb.Net
Dim tbl As SmGrid=Proj.CurrentSmGrid
'直接循环遍历
For Each tc As DataColumn In tbl.DataTableHelp.DataTable.Columns
    If tc.ColumnName="目标列" Then
        MessageBox.Show("找到了!")
    End If
Next

 C#
SmGrid tbl = Proj.CurrentSmGrid;
// 直接循环遍历
foreach (DataColumn tc in tbl.DataTableHelp.DataTable.Columns)
{
    if (tc.ColumnName == "目标列")
    {
        MessageBox.Show("找到了!");
    }
}