草稿

C#打印功能实现与DataGridView技巧
本文介绍了一种使用C#实现打印功能的方法,并详细展示了如何通过PrintDocument类及PrintPage事件来生成并打印定制化的图片模板。此外,还分享了一些关于DataGridView控件使用的实用技巧,包括数据更新、字符串处理及正则表达式的应用。

打印的原理是:生成mdi文件,系统碰到mdi的时候会自动以打印的方式处理。所以,不管用什么模板,什么方式;能在PrintPage事件处理中,生成一张要打印内容的图片就OK了!

C#实现打印源码如下:

#region 打印
        private void btnPrint_Click(object sender, EventArgs e)
        {
            //打印预览
            //PrintPreviewDialog ppd = new PrintPreviewDialog();
            PrintDocument pd = new PrintDocument();
            //设置边距
            Margins margin = new Margins(20, 20, 20, 20);
            pd.DefaultPageSettings.Margins = margin;
            ////纸张设置默认
            //PaperSize pageSize = new PaperSize("First custom size", 800, 600);
            //pd.DefaultPageSettings.PaperSize = pageSize;
            //打印事件设置
            pd.PrintPage += new PrintPageEventHandler(this.pd_PrintPage);
            //ppd.Document = pd;
            //ppd.ShowDialog();
            try
            {
                pd.Print();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "打印出错", MessageBoxButtons.OK, MessageBoxIcon.Error);
                pd.PrintController.OnEndPrint(pd, new PrintEventArgs());
            }
        }
        //打印事件处理
        private void pd_PrintPage(object sender, PrintPageEventArgs e)
        {
            string date = lblDate.Text; //当前日期
            string flowId = lblFlowId.Text; //流水号
            string payDate = PayDate.Year.ToString() + "年" + PayDate.Month.ToString() + "月"; //应收年月
            string adminId = lblAdminId.Text; //操作员编号
            string baseExpense = lblBaseExpense.Text; //应交基本费用
            string fine = lblFine.Text; //罚款数目
            string upExpense = lblUpExpense.Text; //上月上余
            string actualExpense = txtActualExpense.Text; //实际应交费用
            string chineseExpense = DecimalToChinese.ConvertSum(actualExpense); //实际应交费用的中文大写

   //读取图片模板
            Image temp = Image.FromFile(@"Receipts.jpg");
            GetResultIntoImage(ref temp, UserId, flowId, date, baseExpense, fine, upExpense, actualExpense, chineseExpense, payDate, adminId);
            int x = e.MarginBounds.X;
            int y = e.MarginBounds.Y;
            int width = temp.Width;
            int height = temp.Height;
            Rectangle destRect = new Rectangle(x, y, width, height);
            e.Graphics.DrawImage(temp, destRect, 0, 0, temp.Width, temp.Height, System.Drawing.GraphicsUnit.Pixel);
        }

        /// <summary>
        /// 将收费结果填充到图片模板
        /// </summary>
        private void GetResultIntoImage(
            ref Image temp,
            string userId,
            string flowId,
            string currentDate,
            string baseExpense,
            string fine,
            string upExpense,
            string actualExpense,
            string chineseExpense,
            string payDate,
            string adminName)
        {
            //读取图片模板
            Graphics g = Graphics.FromImage(temp);

            Font f = new Font("宋体", 12);
            Brush b = new SolidBrush(Color.Black);
           
   //填充数据到图片模板(位置要在制作图片模板的时候度量好)
            g.DrawImage(temp, 0, 0, temp.Width, temp.Height);
            g.DrawString(userId, f, b, 168, 105);
            g.DrawString(UserName, f, b, 166, 134);
            g.DrawString(flowId, f, b, 535, 105);
            g.DrawString(currentDate, f, b, 535, 134);
            g.DrawString(baseExpense, f, b, 219, 202);
            g.DrawString(fine, f, b, 372, 202);
            g.DrawString(upExpense, f, b, 486, 202);
            g.DrawString(actualExpense, f, b, 596, 202);
            g.DrawString(chineseExpense, f, b, 196, 238);
            g.DrawString(payDate, f, b, 176, 269);
            g.DrawString(adminName, f, b, 497, 298);

            g.Dispose();
        }
        #endregion

 

 

 

用string.Replace方法将  ' 单引号替换为  '' 双引号,可以避免用户在输入 '  单引号的时候提交到数据库里失败的问题。
例如: temp_str = dgvOS.CurrentCell.Value.ToString();
                DataRow[] eid = dt_ed.Select("版本='" +  temp_str .Replace ("'","''")+ "'");

 


DataAdapter的名字为adapter,DataSet命名为set
SqlCommandBuilder builder = new SqlCommandBuilder (adapter)
adapter.Update(set,"表名")
    DataGridView里更新数据实现与数据库同步。

 

第一个错误 Main.cs   854行   第一次打开,双击了根节点,展开后,再双击根节点和子节点的连接线(不点在子节点上),导致以下两个条件都满足,但是此时 tvHardwareList.SelectedNode的值还是根节点上的值;
 if (level > 0 && tvHardwareList.SelectedNode != null)
            {
                ...
  ...
            }


在 datagridview上点击右键添加系统,如果只有COMBOBOXOS,则右键菜单显示添加系统版本,否则右键菜单显示添加版本号

 

 

 

-------------------------用正则表达式校验IP地址的格式-------------------引用using System.Text.RegularExpressions;
-------------------------用到获取系统当期时间。-------------------------

System.DateTime currentTime=new System.DateTime();
            currentTime=System.DateTime.Now;

            string s_reg = @"^([1-9]|[1-9]/d|(1/d{2}|2[0-5][0-5]))/.([0-9]|[1-9]/d|(1/d{2}|2[0-5][0-5]))/.([0-9]|[1-9]/d|(1/d{2}|2[0-5][0-5]))/.([0-9]|[1-9]/d|(1/d{2}|2[0-5][0-5]))$";
            string s = cbLanIP.Text;
            Regex reg = new Regex(s_reg);
            if (reg.IsMatch(s))
            { }
            else
            {
                MessageBox.Show("IP地址格式错误!","提示!");
            }
            SqlConnection conn=new SqlConnection ("Server=.;UID=sa;PWD=123456;Database=Server");
            conn.Open ();
            string cmdstr="insert into ipinfo values('"+DbHelperSQL.ID  +"','"+s +"','"+Convert .ToDateTime( currentTime.ToString ("f"))+"','1','true','1')";
            SqlCommand cmd = new SqlCommand(cmdstr, conn );
            cmd.ExecuteNonQuery();
            conn.Close();
            MessageBox.Show("添加IP成功!");

----------------------------------------------------------------------------

 

 


-------------------------执行SQL语句,无返回值。-------------------------

   SqlConnection conn=new SqlConnection ("Server=.;UID=sa;PWD=123456;Database=Server");
                conn.Open ();
                string cmdstr="insert into ipinfo values('"+DbHelperSQL.ID  +"','"+s +"','"+Convert .ToDateTime( currentTime.ToString ("f"))+"','1','true','1')";
                SqlCommand cmd = new SqlCommand(cmdstr, conn );
                cmd.ExecuteNonQuery();
                conn.Close();


-------------------------------------------------------------------------

-------------------------执行SQL语句,有返回值,存到一个DataSet的表里。--------------------
  string connStr = "Server=localhost;UID=sa;PWD=123456;Database=Server";
                    DataSet maxds = new DataSet();
                    SqlDataAdapter sqlDataAdapter1 = new SqlDataAdapter("select ID,g_id from serverinfo where s_no='" + DbHelperSQL.S_No + "'", connStr);
                    sqlDataAdapter1.Fill(maxds);
                    int ID = Convert.ToInt32(maxds.Tables[0].Rows[0][0].ToString());
                    int G_ID = Convert.ToInt32(maxds.Tables[0].Rows[0][1].ToString());


-------------------------------------------------------------------------

 


---------------------------创建存储过程的例子----------------------------------------------
create Procedure [dbo].[Proc_IPInfo_Insert]
 @ID int,
 @I_IP nvarchar(50),
 @I_ActiveTime datetime,
 @S_ID int,
 @I_Active bit,
 @I_Type int
 
AS
 
INSERT INTO IPInfo (
 ID,
 I_IP,
 I_ActiveTime,
 S_ID,
 I_Active,
 I_Type
) VALUES(
 @ID ,
 @I_IP ,
 @I_ActiveTime,
 @S_ID ,
 @I_Active ,
 @I_Type
)
 
 --------------------------------------------------------------------------------------------
create proc [dbo].[select_si_sg_by_GroupName]
@GroupName nvarchar(50)
as
 select a.id,a.s_no,b.id from serverinfo a,servergroup b where a.g_id=b.id and b.groupname=@GroupName

 

 

 

 

 

null   空(连个对象都没有)
empty  空(空对象)
''     空(空字符)

 


DataGridView 中右键单击一个cell使它为选中状态

private void dgvOS_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
        {
            //DataGridView currentcell =dgvOS.CurrentCell.get(ClickPoint);
            if (e.Button == MouseButtons.Right)
            {
                dgvOS .CurrentCell =dgvOS[e.ColumnIndex, e.RowIndex];
                dgvOS.ContextMenuStrip = cmsOS;
            }
        }

 

### 如何在 MySQL 中创建或管理草稿 #### 创建草稿表 为了创建一个用于存储草稿的表,可以定义一张具有特定结构的表来保存未完成的内容。以下是创建草稿表的一个示例: ```sql CREATE TABLE draft_table ( id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255) NOT NULL COMMENT '标题', content TEXT COMMENT '内容', state TINYINT DEFAULT 0 COMMENT '状态:0 草稿;1 已发布', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' ); ``` 此表设计中包含了 `state` 字段[^5],用来区分记录的状态(草稿还是已发布)。默认情况下,新插入的记录会被标记为草稿。 --- #### 插入草稿数据 向上述草稿表中插入一条新的草稿记录可以通过以下 SQL 语句实现: ```sql INSERT INTO draft_table (title, content, state) VALUES ('我的文章', '这是文章的内容...', 0); ``` 这里将 `state` 设置为 `0`,表示该条目是一个草稿。 --- #### 查询草稿数据 如果需要查询所有的草稿记录,则可以执行如下查询操作: ```sql SELECT * FROM draft_table WHERE state = 0; ``` 这条命令会返回所有处于草稿状态 (`state=0`) 的记录。 --- #### 更新草稿至已发布 当草稿准备好被正式发布时,可以将其状态更改为已发布的状态(即 `state=1`),例如: ```sql UPDATE draft_table SET state = 1 WHERE id = 1; ``` 这一步骤假设我们正在修改 ID 为 `1` 的那条记录,并将其从草稿转为已发布状态。 --- #### 删除草稿 对于不再需要的草稿,可以直接删除对应的记录: ```sql DELETE FROM draft_table WHERE id = 2 AND state = 0; ``` 这里的条件确保只删除那些尚未发布的草稿记录。 --- #### 使用存储过程清理草稿 通过 Navicat 创建一个存储过程,定期自动清除超过一定天数的草稿记录。下面展示了一个简单的例子[^4]: ```sql DELIMITER $$ CREATE PROCEDURE cleanup_drafts() BEGIN DELETE FROM draft_table WHERE state = 0 AND DATEDIFF(CURDATE(), created_at) > 7; END$$ DELIMITER ; ``` 这个存储过程的作用是从 `draft_table` 表中移除所有超过七天且仍处于草稿状态的记录。 --- #### 配置 Binlog 参数支持 CDC 特性 如果您计划利用 Flink 等工具实时捕获 MySQL 数据库中的变化事件,那么还需要调整 MySQL 的配置文件以启用完整的行日志模式。具体来说,在数据库管理界面下的参数设置部分,应将 `binlog_row_image` 设定为 FULL 值][^[^23]。这样做的目的是为了让变更数据捕捉功能能够正常运作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值