如何在文本框C#中创建列

时间:2017-05-18 09:18:31

标签: c# datagridview textbox

我有以下代码从DataGridView获取所有行并将其添加到文本框中,多行。我想在3列的文本框中显示文本。

当前代码如下所示:pic1

我想要显示这样的内容:pic2

string billInfo = string.Empty;
foreach (DataGridViewRow row in dataGridView2.Rows)
{
    billInfo = string.Format("{0}{1} {2} lei  Cod Produs:{3}{4}", billInfo, row.Cells["dataGridViewTextBoxColumn1"].Value, row.Cells["dataGridViewTextBoxColumn3"].Value, row.Cells["dataGridViewTextBoxColumn4"].Value, Environment.NewLine);
}
textBox1.Text = billInfo;

2 个答案:

答案 0 :(得分:0)

最好使用ListView。但是,如果您坚持使用TextBox,请在TextBox上使用固定宽度字体(所有字母都具有相同的宽度,例如Courier)。然后,使用标签(\t在字符串中)格式化文本,如下所示:

billInfo = string.Format("{0}{1}\t\t{2}\t\tlei\t\tCod Produs:{3}{4}", 
    billInfo, 
    row.Cells["dataGridViewTextBoxColumn1"].Value, 
    row.Cells["dataGridViewTextBoxColumn3"].Value, 
    row.Cells["dataGridViewTextBoxColumn4"].Value, 
    Environment.NewLine);

尝试使用多个标签来实现所需的效果。

答案 1 :(得分:0)

如果您真的想以文本框的形式进行此操作,那么最好根据文本框创建一个新的自定义控件,并使用它来根据需要设置文本。这就是我在下面所做的。它需要改进,但会让你开始。

public partial class ColumnTextBox : TextBox
{
    /// <summary>
    /// The string to use to separate the columns
    /// </summary>
    public string ColumnSeparator { get; set; }

    public ColumnTextBox()
    {
        InitializeComponent();
        this.Multiline = true;
        this.Font = new Font(FontFamily.GenericMonospace.Name, this.Font.Size);
        this.WordWrap = false;
        this.ScrollBars = ScrollBars.Both;
        this.ColumnSeparator = " ";
    }

    /// <summary>
    /// Set the Text data in folumn format
    /// </summary>
    /// <param name="rowData">the data to put into the text box</param>
    public void SetColumnText(List<List<string>> rowData)
    {
        //We manually set the font to ensure it is monospaced.  Without this, the method will not format the data in nice neat columns as we want
        this.Font = new Font(FontFamily.GenericMonospace.Name, this.Font.Size);
        if (rowData == null || rowData.Count == 0)
            throw new ArgumentException("Rowdata cannot be null or empty");

        if (rowData[0] == null || rowData[0].Count == 0)
            throw new ArgumentException("Rowdata must contain some column data");

        //the string format we will use
        string format = "{0,-?}";

        //determine the max size of every column, and store it
        int[] colMaxSizes = CalcMaxSizes(rowData);

        StringBuilder sb = new StringBuilder();

        //Loop through every row & column to build the string piece by piece
        foreach (List<string> row in rowData)
        {
            int col = 0;
            foreach (string data in row)
            {
                //append the data, using the format, padded to the max size.
                //Appened column separator to end
                sb.AppendFormat(format.Replace("?", colMaxSizes[col].ToString()), data).Append(ColumnSeparator);
                col++;
            }
            sb.Append(Environment.NewLine);
        }

        //Remove last newline
        string text = sb.ToString();
        this.Text = text.Substring(0, text.Length - 1);
    }

    /// <summary>
    /// Calculate the max size of every column
    /// </summary>
    /// <param name="rowData">The data to search through</param>
    /// <returns>An array contain the max size/lengt of the data in each column</returns>
    private int[] CalcMaxSizes(List<List<string>> rowData)
    {
        int[] maxSizes = new int[rowData[0].Count];
        foreach (List<string> row in rowData)
        {
            int col = 0;
            foreach (string data in row)
            {
                if (data.Length > maxSizes[col])
                    maxSizes[col] = data.Length;
                col++;
            }

        }

        return maxSizes;
    }
}

确保使用等宽字体非常重要,否则这将无效。这一行确保了这一点;

this.Font = new Font(FontFamily.GenericMonospace.Name, this.Font.Size);

在这种情况下,您可以构建一个类型为string的列表列表,该列表表示您的行和列,并将其传递给方法SetColumnText()。您可能希望将其更改为使用集合或其他内容。

然后,该方法将遍历数据并确定每列的最大宽度 接下来,它将构建数据并将每列填充到该列的数据的最大宽度。

它通过使用String格式&#34; {0, - ?}&#34;来实现这一点,其中?由该列的最大大小替换。

还有一个ColumnSeparator,允许您为列定义不同的分隔符,例如选项卡。

你可以像这样使用它;

List<List<string>> myData = new List<List<string>>();
//Build your data here
this.columnTextBox1.SetColumnText(myData);