一、读入txt文本
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog xjOpenFileDialog = new OpenFileDialog();
xjOpenFileDialog.Filter = "文本文件(*.txt)|*.txt";
if (xjOpenFileDialog.ShowDialog() == DialogResult.OK)
{
xjFilePath = xjOpenFileDialog.FileName;
Console.WriteLine(xjFilePath);//显示文件路径
StreamReader sr = new StreamReader(xjFilePath, Encoding.Default);
this.textBox1.Text = sr.ReadToEnd();//显示内容
sr.Close();
}
}
用StreamReader来读取txt,记得要用sr.Close()来关闭数据流。
//label2上显示文件名
string file_name = null;
for (int i = xjFilePath.Length - 1; i >= 0; --i)
{
if (xjFilePath[i] != '\\')
{
file_name = xjFilePath[i] + file_name;
}
else break;
}
label2.Text = file_name;
文件名从文件路径字符串中获得,截取最后一个’\‘到末尾的子字符串,’\'需要加转义字符。
二、保存txt文本
private void saveAsToolStripMenuItem_Click(object sender, EventArgs e)
{
SaveFileDialog xjSaveFileDialog = new SaveFileDialog();
xjSaveFileDialog.Filter = "文本文件(*.txt)|*.txt";
if (xjSaveFileDialog.ShowDialog() == DialogResult.OK)
{
xjFilePath = xjSaveFileDialog.FileName;
if (!File.Exists(xjFilePath))
{
FileStream xjFileStream = new FileStream(xjFilePath, FileMode.Create, FileAccess.Write);
StreamWriter xjStreamWriter = new StreamWriter(xjFileStream, Encoding.Default);
xjStreamWriter.WriteLine(textBox1.Text);//要写入的
xjStreamWriter.Close();
xjFileStream.Close();
Console.WriteLine("保存成功!");
}
}
}
三、识别光标定位在textBox的哪一行
//将每一行首字符位置保存在数组index里
int p = 0; //定义位置
int[] index = new int[1000];
index[0] = 0;
for (int i = 0; i < textBox1.Lines.Length; ++i)
{
p += 2; //每个换行符占2
p += textBox1.Lines[i].Length; //加上每行的字符数
index[i + 1] = p;
}
将每一行的首字符的位置保存在index[ ]数组里。
private void textBox1_Click(object sender, EventArgs e)
{
}
调用点击事件
//将光标所在行的内容显示在label1上
int index_line;
int row_index = 0;
index_line = textBox1.GetFirstCharIndexOfCurrentLine();
for (int i = 0; i < textBox1.Lines.Length; ++i)
{
if(index[i] == index_line)
{
label1.Text = textBox1.Lines[i];
index_line_number = i;
Console.WriteLine("当前所在行:" + index_line_number);
Console.WriteLine("当前所在行第一个字符位置:" + index_line);
break;
}
}
GetFirstCharIndexOfCurrentLine()函数只能获取当前光标所在行的第一个字符的位置,查找该函数返回值在index[ ]数组的第几位,就是第几行。
四、修改textBox指定行
//重新加载textbox内容
string newcontent = null;
for(int i = 0; i < index_line_number; ++i)
{
newcontent += textBox1.Lines[i];
newcontent += "\r\n";
}
newcontent += str_line;
for (int i = index_line_number+1; i < textBox1.Lines.Length; ++i)
{
newcontent += textBox1.Lines[i];
newcontent += "\r\n";
}
textBox1.Text = newcontent;
index_line_number是需要修改的行号,将其替换为str_line,重新组成newcontent,再写入textBox里。
五、加入键盘快捷键
protected override void OnKeyDown(KeyEventArgs e)
{
//Ctrl+S 保存
if (e.Control & e.KeyCode == Keys.S)
{
saveToolStripMenuItem.PerformClick();
}
}
用键盘按键按下Ctrl+S,模拟鼠标点击save按钮。
六、文件名带*
/* 修改文本后以“*”表示,保存后去除“*” */
private void textBox1_TextChanged(object sender, EventArgs e)
{
if(label2.Text[label2.Text.Length - 1] != '*')
label2.Text += '*';
}
修改 textBox内容时,调用textBox1_TextChanged函数,在文件名后加*,表示内容有过改动。
private void saveToolStripMenuItem_Click(object sender, EventArgs e)
{
if (label2.Text[label2.Text.Length - 1] == '*')
label2.Text = label2.Text.Substring(0, label2.Text.Length - 1);
}
点击保存后,文件名后的*消失。
七、字符串分割
string[] split_line = Regex.Split(line, "\\s+", RegexOptions.IgnoreCase);
"\\s+"表示以一个或多个空格分割字符串line,IgnoreCase是忽略大小写。
line = line.Substring(0, line.Length - 1);
除去line末尾的一个字符。
八、dataGridView控件
dataGridView1.Columns.Clear();
DataGridViewTextBoxColumn col1 = new DataGridViewTextBoxColumn();
DataGridViewTextBoxColumn col2 = new DataGridViewTextBoxColumn();
dataGridView1.Columns.Add(col1);
dataGridView1.Columns.Add(col2);
col1.ReadOnly = true;//第一列属性名称不可改
dataGridView1.Columns[0].SortMode = DataGridViewColumnSortMode.NotSortable; //禁止列排序
dataGridView1.Columns[1].SortMode = DataGridViewColumnSortMode.NotSortable;
col1.HeaderText = "属性";
col2.HeaderText = "值";
int row_index = 0;
for (int i = 0; i < 5; i++)
{
DataGridViewRow row = new DataGridViewRow();
row_index = dataGridView1.Rows.Add(row);
dataGridView1.Rows[row_index].Cells[0].Value = "";
dataGridView1.Rows[row_index].Cells[1].Value = "";
}
创建2列5行的dataGridView。
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
}
修改dataGridView单元格里的值调用CellEndEdit函数,可以与textBox相关联,修改单元格的值对应修改textBox里的内容。