代码之家  ›  专栏  ›  技术社区  ›  RedGlyph sumit sonawane

在DataGridView中自定义WrapMode

  •  3
  • RedGlyph sumit sonawane  · 技术社区  · 16 年前

    我用的是可编辑的 DataGridView Windows窗体显示变量列表,这些变量可以包含不同类型的信息,应用程序不知道其格式:路径、字符串、数字等。表单正在使用源数据绑定。

    有些值可能很长,我希望将它们显示在几行上,而不是一条长的、部分可见的行上。原作 WrapMode 在我的例子中不合适,因为它在空格字符上拆分行,而空格字符并不总是存在的:典型的例子是由分号分隔的路径或十六进制数字组成的长路径变量。

    在窗体边框而不是特定字符上换行是可以的,不过只有在必要时这样做才更好。添加其他拆分位置,而不是空格字符,只会更好。

    性能明智:网格行计数永远不会很高:通常为0到10,在某些极端情况下,可以高达50,也可以说是高达4,并且通常每个包的最大长度不应超过4或5行。所以这不是什么大问题。

    你建议怎么做?

    • 处理 CellFormatting 事件,通过插入 \r 在解析提交的值时删除字符?问题在于,单元格似乎有自己的方式在输入模式下重新格式化文本,在两种模式之间切换时改变其外观。可能还有其他副作用有待发现。。。
    • 或者有办法修改 循环模式 我忽略的行为?
    2 回复  |  直到 16 年前
        1
  •  2
  •   Tj Kellie    16 年前

    你可以在run on strings中插入空格,我不知道在使用gridview时还有其他选项,格式有点限制。

    如果您真的需要在固定宽度的单元格中显示,可以尝试以下操作:

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        string cellTxt = e.Row.Cells[1].Text;
        int lengthBeforeBreak = 25;
        if (e.Row.RowType == DataControlRowType.DataRow && cellTxt.Length > lengthBeforeBreak)
        {
            int curPos = 0;
            for (int i = 0; i < Decimal.Round((cellTxt.Length/lengthBeforeBreak),0); i++)
       {
                if (cellTxt.IndexOf(" ", curPos, lengthBeforeBreak) == -1)
                {
                    cellTxt = cellTxt.Insert(curPos+lengthBeforeBreak, " ");
                }
                curPos += lengthBeforeBreak + 1;
       }
            e.Row.Cells[1].Text = cellTxt;
        }
    
    }
    
        2
  •  0
  •   Codesleuth    16 年前

    我做同样的事情,但没有约束力,设置如下:

    this.dataGridView1.Rows[this.RowIndex].Height = 100;
    var style = row.Cells[this.ColumnIndex].Style;
    style.WrapMode = DataGridViewTriState.True;
    style.Alignment = DataGridViewContentAlignment.TopLeft;
    

    也许让这些成员 DefaultCellStyle 列的属性 DataBind() 对你也一样。