我有以下代码从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;
答案 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);