【问题标题】:Customized WrapMode in DataGridViewDataGridView 中的自定义 WrapMode
【发布时间】:2010-12-26 04:17:27
【问题描述】:

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

有些值可能很长,我想将它们显示在多行而不是长的、部分可见的行上。原始的 WrapMode 在我的情况下不合适,因为它在空格字符上分割行,而这些字符并不总是存在:典型的例子是由分号分隔的路径或十六进制数字组成的长 PATH 变量。

在表单边框而不是特定字符上换行会很好,但仅在必要时这样做会更好。添加其他拆分位置,而不是空格字符,只会更好。

性能方面:网格行数永远不会很高:通常为 0 到 10,在某些极端情况下可能高达 50,通常每个的最大长度不应超过 4或包装时 5 行。所以这不是一个大问题。

你会如何建议这样做?

  • 通过插入\r 字符并在解析提交值时删除它们来处理CellFormatting 事件?这样做的问题是,单元格似乎有自己的方式在输入模式下重新格式化文本,在两种模式之间切换时改变其外观。可能还有其他副作用有待发现...
  • 或者有没有办法修改我忽略的WrapMode 行为?

【问题讨论】:

    标签: c# winforms .net-3.5 datagridview


    【解决方案1】:

    您总是可以在连续字符串中插入空格,当您使用网格视图时,我不知道任何其他选项,格式在那里有点受限。

    如果你真的需要在固定宽度的单元格中显示它,你可以尝试这样的事情:

    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;
        }
    
    }
    

    【讨论】:

    • 我考虑过插入 \r 而不是空格,因为程序需要知道在验证输入时要删除哪些字符(不能让字符串中的那些空格字符),如问题中所述...这是我目前唯一的选择。但是我必须准确计算插入它们的位置,使用字符串每个部分的像素数并将它们与单元格宽度进行比较,这是我并不真正期待的。我希望重新使用框架中已有的东西......无论如何谢谢:)
    【解决方案2】:

    我做同样的事情,但没有通过设置以下绑定:

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

    也许在DataBind() 之前将这些成员设置在列的DefaultCellStyle 属性上会为您做同样的事情。

    【讨论】:

    • 我已经通过将 WrapMode 设置为这个值来使用它,问题是它依赖于空格字符来找到分割行的位置,而且在我的情况下并不总是这样的字符,所以它不会分割线条,我最终会得到一个水平滚动条。
    猜你喜欢
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多