C# 技巧总结——1

1.useControl页面在使用的时候,是没有showDialog功能的。

2.列表在潘顿是否为空的时候可以直接判断列表元素的数量是否为零。

3.foreach循环遍历的时候,要模拟这个循环完整的运行过程,在不容易出错,否则容易出现逻辑错误。

4.在实例一个对象时,要确认是否有值:在实例化后,也要确定是新复制一个实例,还是调用的原有实例。以此确定使用的属性是否存在或有值。如:

new ChartSet(this, gate).ShowDialog();//仅仅是new了一个实例

又或者:



public ObservableCollection<Alarm> BoardList_ip { get; set; }
private void CopyData(){
    var  boardlist = new Alarm { };
    boardlist.BoardCheck = false;
    boardlist.BoardName = board.Entity.IP;
    BoardList_ip.Add(boardlist);
}

5.在值的传递与接收时,一定要确认时谁传出的值,又是谁接受的值,中间有没有通过其他的字段进行运算。如:

private void gate_setting_Click(object sender, RoutedEventArgs e)
        {
            var gate = new GateData();
            if (new ChartSet(this, gate).ShowDialog()==true)
            {
                chart.SetGate(new ChartControls.Gate() { X1 = gate.X1, X2 = gate.X2, Y = gate.Y }, gate.Index);
                if (CurrentBoard!=null)
                {
                    CurrentBoard.Gates[gate.Index].Start = gate.X1;
                    CurrentBoard.Gates[gate.Index].Width = gate.X2 - gate.X1;
                    CurrentBoard.Gates[gate.Index].Height = gate.X1;
                }
            }
        }

6.如果出现空指针的错误,一般情况下不是没有实例或对象,就是没有值存在。

7.在做页面跳转的时候尽可能使用view分类,页面控件才能够跳转。

8.在做列表显示的时候,要注意格式,是可以解决双击才能出发时间的问题的

<DataGrid x:Name="AlarmChart" Grid.Row="2" HorizontalAlignment="Center" HorizontalContentAlignment="Center" BorderBrush="Gray" BorderThickness="1" SelectedIndex="{Binding AlarmSelectedIndex,Mode=TwoWay}" x:FieldModifier="public"  GridLinesVisibility="None" AutoGenerateColumns="False" CanUserDeleteRows="False" CanUserAddRows="False" IsReadOnly="False" ItemsSource="{Binding AlarmList,Mode=TwoWay}" >
                        <DataGrid.Columns>

                            <DataGridTemplateColumn Header="报警源">
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <ComboBox Width="60" SelectedIndex="{Binding AlarmIndex,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
                                            <ComboBoxItem Content="I"/>
                                            <ComboBoxItem Content="A"/>
                                        </ComboBox>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>

                            <DataGridTemplateColumn Header="激活报警">
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <CheckBox Width="80" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" IsChecked="{Binding AlarmChecked,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>

                            <DataGridTemplateColumn Header="权重系数">
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <TextBox Width="100" Text="{Binding AlarmICoe,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>

                            <DataGridTemplateColumn Header="周期">
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <TextBox Width="80" Text="{Binding AlarmDuring,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>

                            <DataGridTemplateColumn Header="输出位">
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <ComboBox Width="90" SelectedIndex="{Binding AlarmBitMask,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
                                            <ComboBoxItem Content="第0位输出"/>
                                            <ComboBoxItem Content="第1位输出"/>
                                        </ComboBox>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>

                            <DataGridTemplateColumn Header="报警模式">
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <ComboBox Width="100" SelectedIndex="{Binding AlarmMode,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
                                            <ComboBoxItem Content="渡越时间超上限"/>
                                            <ComboBoxItem Content="渡越时间超下限"/>
                                        </ComboBox>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>

                            <DataGridTemplateColumn Header="输出节拍">
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <ComboBox Width="80" SelectedIndex="{Binding AlarmRhythm,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
                                            <ComboBoxItem Content="报警保持输出"/>
                                            <ComboBoxItem Content="定时输出"/>
                                        </ComboBox>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>

                            <DataGridTemplateColumn Header="报警逻辑">
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <ComboBox Width="80" SelectedIndex="{Binding AlarmLog,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
                                            <ComboBoxItem Content="冲过闸门输出报警"/>
                                            <ComboBoxItem Content="关闭报警"/>
                                        </ComboBox>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>

                            <DataGridTemplateColumn Header="报警关联">
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <ComboBox Width="80" SelectedIndex="{Binding AlarmTmSpac,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
                                            <ComboBoxItem Content="自由输出"/>
                                            <ComboBoxItem Content="关联时间输出"/>
                                        </ComboBox>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>
                            
                        </DataGrid.Columns>
                    </DataGrid>

且在作数据Binding时,可以新建一个类做数据中转。

9.在做数据处理的时候,一定要注意数值的传递方向。是单向的还是双向的。一般都是单向的。特别是用等号赋值或者一些对值进行操作的结果都是单项的值。结果不会影响之前的值。例如A=B,B=C+D,A不等于C+D。若是需要用到c+d的值通过A是调用不到的。所以一定要注意值得传递方向。

10.页面弹窗有时候是需要传递出来数据的。但是在弹窗里操作的值,是对原始数据的复制以后进行操作。无论结果怎么样。都不会影响到原始数据。这时候可以在原来的基础上,在弹窗里增加一个属性。对属性进行操作。

public string Result { get; set; }
var input = new TextBoxInput();//定义弹窗弹出
if (input.ShowDialog() == true)
{
   config.CustomName = input.Result;
}

//Console.WriteLine(input.Result);
//config.CustomName = "ss";
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using UTNet.Models;

namespace UTNet.Views
{
    /// <summary>
    /// TextBoxInput.xaml 的交互逻辑
    /// </summary>
    public partial class TextBoxInput : Window
    {
        public TextBoxInput()
        {
            
            InitializeComponent();
            this.DataContext = this;
            this.KeyDown += InputDialog_KeyDown;

        }

        public string Result { get; set; }

        private void InputDialog_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                if (input_tb.Text.Trim().Equals(""))
                {
                    MessageBox.Show("请输入有效内容!", "输入有误");
                }
                else
                {
                    this.DialogResult = true;
                    this.Result = input_tb.Text.Trim();
                    this.Close();
                }
            }
        }


        public string Note
        {
            get { return input_tb.Text; }
            set { }
        }
    }

    }

11.在数据定义的时候,要分清楚数据是否是标签还是实例。标签的话是否被赋值了。

private Board board;

这就是一个标签,在使用的时候会出现空指针的情况。

public AScan( Board board)
        {
            this.board = board;
        }

这就是在给他赋值。只用赋值后才能使用。

12。类与对象要分清楚。静态与动态要分清楚。静态的就是一个实例。动态的就是一个引用值。就像是建筑图纸与建筑之间的关系。而类与对象就是一批水果就是类。其中苹果,李子就是一个对象。至于值参数与引用参数:在把变量作用于实参之前,变量必须赋值(除非是out参数)。对于引用类型,变量可以被设置为一个实际的引用或null。使用值参数,通过将实参的值复制到形参的方式,把数据传递到方法。使用引用参数时,必须在方法的申明和调用中都使用关键字ref修饰符。实参必须是变量,在用作实参前必须被赋值。如果是引用类型的变量,可以赋值为一个引用或者null值。

猜你喜欢

转载自blog.csdn.net/zhuqiao4814/article/details/82381274