Nextjs App with MUI5-Typescript-Supabase

Use to run: npm run dev

  • npx create-next-app@latest –ts
  • cd my-app
  • npm install @mui/material @emotion/react @emotion/styled @emotion/css @emotion/server @mui/icons-material @supabase/supabase-js@rc
  • Create File lib\createEmotionCache.ts :
import createCache from '@emotion/cache';
const createEmotionCache = () => {
    return createCache({ key: 'css' });
};
export default createEmotionCache;

  • Create File styles\theme.ts :
import { createTheme } from '@mui/material/styles';
import { red } from '@mui/material/colors';

const theme = createTheme({
    palette: {
        primary: {
            main: '#556cd6',
        },
        secondary: {
            main: '#19857b',
        },
        error: {
            main: red.A400,
        },
    },
});
export default theme;
  • Edit File pages\_document.ts :
import * as React from 'react';
import Document, { Html, Head, Main, NextScript } from 'next/document';
import createEmotionServer from '@emotion/server/create-instance';
import theme from '../styles/theme';
import createEmotionCache from '../lib/createEmotionCache';

export default class MyDocument extends Document {
    render() {
        return (
            <Html lang="en">
                <Head>
                    {/* PWA primary color */}
                    <meta name="theme-color" content={theme.palette.primary.main} />
                    <link
                        rel="stylesheet"
                        href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap"
                    />
                </Head>
                <body>
                    <Main />
                    <NextScript />
                </body>
            </Html>
        );
    }
}

// `getInitialProps` belongs to `_document` (instead of `_app`),
// it's compatible with static-site generation (SSG).
MyDocument.getInitialProps = async (ctx) => {
    // Resolution order
    //
    // On the server:
    // 1. app.getInitialProps
    // 2. page.getInitialProps
    // 3. document.getInitialProps
    // 4. app.render
    // 5. page.render
    // 6. document.render
    //
    // On the server with error:
    // 1. document.getInitialProps
    // 2. app.render
    // 3. page.render
    // 4. document.render
    //
    // On the client
    // 1. app.getInitialProps
    // 2. page.getInitialProps
    // 3. app.render
    // 4. page.render

    const { renderPage: originalRenderPage } = ctx;

    // You can consider sharing the same emotion cache between all the SSR requests to speed up performance.
    // However, be aware that it can have global side effects.
    const cache = createEmotionCache();
    const { extractCriticalToChunks } = createEmotionServer(cache);

    ctx.renderPage = () =>
        originalRenderPage({
            // eslint-disable-next-line react/display-name
            enhanceApp: (App: any) => (props) =>
                <App emotionCache={cache} {...props} />,
        });

    const initialProps = await Document.getInitialProps(ctx);
    // This is important. It prevents emotion to render invalid HTML.
    // See https://github.com/mui-org/material-ui/issues/26561#issuecomment-855286153
    const emotionStyles = extractCriticalToChunks(initialProps.html);
    const emotionStyleTags = emotionStyles.styles.map((style: any) => (
        <style
            data-emotion={`${style.key} ${style.ids.join(' ')}`}
            key={style.key}
            // eslint-disable-next-line react/no-danger
            dangerouslySetInnerHTML={{ __html: style.css }}
        />
    ));

    return {
        ...initialProps,
        // Styles fragment is rendered after the app and page rendering finish.
        styles: [
            ...React.Children.toArray(initialProps.styles),
            ...emotionStyleTags,
        ],
    };
};
  • Edit File pages\_ app.ts :
import * as React from 'react';
import Head from 'next/head';
import { AppProps } from 'next/app';
import { ThemeProvider } from '@mui/material/styles';
import CssBaseline from '@mui/material/CssBaseline';
import { CacheProvider, EmotionCache } from '@emotion/react';
import theme from '../styles/theme';
import createEmotionCache from '../lib/createEmotionCache';

// Client-side cache, shared for the whole session of the user in the browser.
const clientSideEmotionCache = createEmotionCache();

interface MyAppProps extends AppProps {
  emotionCache?: EmotionCache;
}

const App = (props: MyAppProps) => {
  const { Component, emotionCache = clientSideEmotionCache, pageProps } = props;
  return (
    <CacheProvider value={emotionCache}>
      <Head>
        <title>My page</title>
        <meta name="viewport" content="initial-scale=1, width=device-width" />
      </Head>
      <ThemeProvider theme={theme}>
        {/* CssBaseline kickstart an elegant, consistent, and simple baseline to build upon. */}
        <CssBaseline />
        <Component {...pageProps} />
      </ThemeProvider>
    </CacheProvider>
  );
};

export default App;

LOGO SAYISAL ZAMAN İŞLEMLERİ

C# Fonksiyonu

        private string LogoTimetoSystemTime(double GELENDEGER)
        {
            string RESULT = "";
            int HOUR = 0;
            if (GELENDEGER > 0)
            {
                HOUR = Convert.ToInt32(Math.Round(GELENDEGER / 16777216, 2));
            }
            int MINUTE = 0;
            if (GELENDEGER > 0)
            {
                MINUTE = Convert.ToInt32(Math.Round((GELENDEGER - HOUR * 16777216) / 65536, 2));
            }
            int SECOND = 0;
            if (GELENDEGER > 0)
            {
                SECOND = Convert.ToInt32(Math.Round((GELENDEGER - HOUR * 16777216 - MINUTE * 65536) / 256, 2));
            }
            RESULT = HOUR.ToString() + ":" + (MINUTE.ToString().Length == 0 ? 0 + MINUTE.ToString() : MINUTE.ToString()) + ":" + (SECOND.ToString().Length == 0 ? 0 + SECOND.ToString() : SECOND.ToString());
            return RESULT; 
        }

Sql Fonksiyonu

create FUNCTION [dbo].[fn_LogoTimetoSystemTime] (@GELENDEGER INT)
RETURNS VARCHAR(8)
AS
BEGIN
DECLARE @SAAT VARCHAR(2), @DAKIKA VARCHAR(2), @SANIYE VARCHAR(2), @SONUC VARCHAR(8)

SELECT
@SAAT=RTRIM(CONVERT(char(20), ROUND(@GELENDEGER / 16777216, 2))),
@DAKIKA=RTRIM(CONVERT(char(20), ROUND((@GELENDEGER - ROUND(@GELENDEGER / 16777216, 2) * 16777216)/ 65536, 2))),
@SANIYE=RTRIM(CONVERT(char(20), ROUND((@GELENDEGER - ROUND(@GELENDEGER / 16777216, 2) * 16777216 - ROUND((@GELENDEGER - ROUND(@GELENDEGER / 16777216, 2) * 16777216) / 65536, 2) * 65536) / 256, 2)))

SET @SAAT=CASE WHEN LEN(@SAAT)=1 THEN '0'+@SAAT ELSE @SAAT END 
SET @DAKIKA=CASE WHEN LEN(@DAKIKA)=1 THEN '0'+@DAKIKA ELSE @DAKIKA END 
SET @SANIYE=CASE WHEN LEN(@SANIYE)=1 THEN '0'+@SANIYE ELSE @SANIYE END


SET @SONUC= @SAAT + ':' +@DAKIKA + ':' + @SANIYE

RETURN @SONUC
END 
CREATE FUNCTION [dbo].[LG_TIMETOINT](@HH INT,@MM INT,@SS INT)
RETURNS INT
AS
BEGIN
DECLARE @TIME    INT
SELECT @TIME   = (@HH*65536*256+@MM*65536+@SS*256)
RETURN(@TIME)
END
GO

CREATE FUNCTION [dbo].[LG_INTTOTIME](@TIME INT)
RETURNS VARCHAR(8)
AS
BEGIN
DECLARE @HH INT
DECLARE @MM INT
DECLARE @SS INT
SELECT @HH = @TIME/65536/256
SELECT @MM = (@TIME/65536) - (@HH*256)
SELECT @SS = (@TIME/256) - (@HH*65536) - (@MM*256)
RETURN (RIGHT('0'+CAST(@HH AS VARCHAR(2)),2)+':'+RIGHT('0'+CAST(@MM AS VARCHAR(2)),2)+':'+RIGHT('0'+CAST(@SS AS VARCHAR(2)),2))
END
GO

CREATE FUNCTION [dbo].[LG_ADDTIME](@TIME INT,@ADD INT)
RETURNS INT
AS
BEGIN
DECLARE @HH INT
DECLARE @MM INT
DECLARE @SS INT
SELECT @HH = @TIME/65536/256
SELECT @MM = (@TIME/65536) - (@HH*256)
SELECT @SS = (@TIME/256) - (@HH*65536) - (@MM*256)
SELECT @SS = @SS + @ADD
IF @SS > 59
BEGIN
SELECT @MM = @MM + 1
SELECT @SS = @SS - 60
END
IF @MM > 59
BEGIN
SELECT @HH = @HH + 1
SELECT @MM = @MM - 60
END
RETURN (@HH*65536*256+@MM*65536+@SS*256)
END
GO
CREATE FUNCTION [dbo].[fn_LogoDatetoSystemDate] (@DEGER INT) 
RETURNS datetime
AS
BEGIN

DECLARE @GUN VARCHAR(2), @AY VARCHAR(2), @YIL VARCHAR(4)
DECLARE @SONUC datetime


SELECT
	@GUN=CAST((CONVERT(INT,CONVERT(BINARY,@DEGER,2),0)-(CONVERT(INT,CONVERT(BINARY,@DEGER,2),0)/256*256)) AS VARCHAR(3))
SELECT
	@AY=CAST(((CONVERT(INT,CONVERT(BINARY,@DEGER,2),0)-(65536*(CONVERT(INT,CONVERT(BINARY,@DEGER,2),0)/65536)))-(CONVERT(INT,CONVERT(BINARY,@DEGER,2),0)-(CONVERT(INT,CONVERT(BINARY,@DEGER,2),0)/256*256)))/256 AS VARCHAR(3))
SELECT
	@YIL=CAST((CONVERT(INT,CONVERT(BINARY,@DEGER,2),0)/65536) AS VARCHAR(6))

	SET @GUN=CASE WHEN LEN(@GUN)<2 THEN '0'+@GUN ELSE @GUN END
	SET @AY=CASE WHEN LEN(@AY)<2 THEN '0'+@AY ELSE @AY END


SONUC:
	IF @DEGER<>0
	BEGIN
		SET @SONUC=CONVERT(DATETIME, @YIL + '-' + @AY + '-' +  @GUN + ' 00:00:00', 102)
	END
	IF @DEGER=0
		SET @SONUC= NULL


RETURN @SONUC
END
GO
CREATE FUNCTION [dbo].[fn_SystemDateToLogoDate] (@date DATETIME) 
RETURNS INT
AS
BEGIN

DECLARE @GUN INT, @AY INT, @YIL INT
DECLARE @SONUC INT

SET @YIL = YEAR(@date)
SET @AY = MONTH(@date)
SET @GUN = DAY(@date)

SET @SONUC = (@YIL * 65536) + (@AY * 256) + @GUN

IF @SONUC = 0
    SET @SONUC = NULL

RETURN @SONUC
END
GO

SQL SERVER BÜTÜN VERİTABANLARINDA VIEW ARA

    DECLARE @views TABLE (ViewName NVARCHAR(4000)) 
    DECLARE @ViewName NVARCHAR(4000) = 'PDA'
    DECLARE @query NVARCHAR(4000) = 'SELECT ''?'' + ''.'' + s.name COLLATE SQL_Latin1_General_CP1_CI_AS + ''.'' + v.name from [?].sys.views v inner join sys.schemas s on v.schema_id=s.schema_id WHERE v.name LIKE ''%' + @ViewName + '%'''

    INSERT INTO @views (ViewName)
    EXEC sp_msforeachdb @query

    SELECT  * 
    FROM    @views  

LOGO SATIŞ TEKLİF YÖNETİMİ TABLOLARININ KENDİ KENDİNE SİLİNMESİNE KARŞI GEÇİCİ ÇÖZÜM

Sorun: Ayda 2-3 kere satış teklif yönetimi modülünün tabloları gece saat 00:00 gibi drop-create yapılmakta.

Job, trigger ve servisler kontrol edildi ilgili işlemi tetikleyen bir şey bulunamadı(tiger3e ver:2.76).

Arge devamlılığı için geçici çözüm olarak prosedur->job yaratıldı(yarım saatte bir) .

Teklif modülü tablolarında eğer data var ise yardımcı tabloya alınacak, eğer data yok ise(drop create olunca boşaldıysa) yardımcı tablolardan gerçek tablolara atacak.

CREATE PROCEDURE YT_KONTROL_SATISTEKLIFYONETIMI_TABLOLARI AS

IF EXISTS(SELECT 1 FROM [MYDB].[dbo].[LG_SLSACTIV] WITH(NOLOCK) WHERE LOGICALREF>0)
    BEGIN
	IF OBJECT_ID(N'[MYDB].[dbo].[YT_RESTORE_LG_SLSACTIV]', N'U') IS NOT NULL  DROP TABLE [MYDB].[dbo].[YT_RESTORE_LG_SLSACTIV];  
        SELECT * INTO [MYDB].[dbo].[YT_RESTORE_LG_SLSACTIV] FROM [MYDB].[dbo].[LG_SLSACTIV]
    END
ELSE
	BEGIN
		SET IDENTITY_INSERT [MYDB].[dbo].[LG_SLSACTIV] ON
		INSERT INTO [MYDB].[dbo].[LG_SLSACTIV]
           (LOGICALREF,[DATE_]
           ,[TIME_]
           ,[ACTTYPE]
           ,[OPPORREF]
           ,[SALESMANREF]
           ,[CSTVNDREF]
           ,[ACTORDER]
           ,[DESCRIPTION]
           ,[PRIORITY]
           ,[APPROVAL]
           ,[DUEDATE]
           ,[DUETIME]
           ,[SENDVIA]
           ,[SENDREF]
           ,[SPECODE]
           ,[CYPHCODE]
           ,[CAPIBLOCK_CREATEDBY]
           ,[CAPIBLOCK_CREADEDDATE]
           ,[CAPIBLOCK_CREATEDHOUR]
           ,[CAPIBLOCK_CREATEDMIN]
           ,[CAPIBLOCK_CREATEDSEC]
           ,[CAPIBLOCK_MODIFIEDBY]
           ,[CAPIBLOCK_MODIFIEDDATE]
           ,[CAPIBLOCK_MODIFIEDHOUR]
           ,[CAPIBLOCK_MODIFIEDMIN]
           ,[CAPIBLOCK_MODIFIEDSEC]
           ,[SITEID]
           ,[RECSTATUS]
           ,[ORGLOGICREF]
           ,[LASTREVISION]
           ,[TEXTINC]
           ,[DESCRIPTION2]
           ,[GUID])
		SELECT LOGICALREF,[DATE_]
           ,[TIME_]
           ,[ACTTYPE]
           ,[OPPORREF]
           ,[SALESMANREF]
           ,[CSTVNDREF]
           ,[ACTORDER]
           ,[DESCRIPTION]
           ,[PRIORITY]
           ,[APPROVAL]
           ,[DUEDATE]
           ,[DUETIME]
           ,[SENDVIA]
           ,[SENDREF]
           ,[SPECODE]
           ,[CYPHCODE]
           ,[CAPIBLOCK_CREATEDBY]
           ,[CAPIBLOCK_CREADEDDATE]
           ,[CAPIBLOCK_CREATEDHOUR]
           ,[CAPIBLOCK_CREATEDMIN]
           ,[CAPIBLOCK_CREATEDSEC]
           ,[CAPIBLOCK_MODIFIEDBY]
           ,[CAPIBLOCK_MODIFIEDDATE]
           ,[CAPIBLOCK_MODIFIEDHOUR]
           ,[CAPIBLOCK_MODIFIEDMIN]
           ,[CAPIBLOCK_MODIFIEDSEC]
           ,[SITEID]
           ,[RECSTATUS]
           ,[ORGLOGICREF]
           ,[LASTREVISION]
           ,[TEXTINC]
           ,[DESCRIPTION2]
           ,[GUID] FROM [MYDB].[dbo].[YT_RESTORE_LG_SLSACTIV]
			SET IDENTITY_INSERT [MYDB].[dbo].[LG_SLSACTIV] OFF
	END


IF EXISTS(SELECT 1 FROM [MYDB].[dbo].[LG_SATI] WITH(NOLOCK) WHERE LOGICALREF>0)
    BEGIN
	IF OBJECT_ID(N'[MYDB].[dbo].[YT_RESTORE_LG_SATI]', N'U') IS NOT NULL  DROP TABLE [MYDB].[dbo].[YT_RESTORE_LG_SATI];  
        SELECT * INTO [MYDB].[dbo].[YT_RESTORE_LG_SATI] FROM [MYDB].[dbo].[LG_SATI]
    END
ELSE 
	BEGIN
		SET IDENTITY_INSERT [MYDB].[dbo].[LG_SATI] ON
		INSERT INTO [MYDB].[dbo].[LG_SATI]
           (LOGICALREF,[USERID]
           ,[CUSTOM]
           ,[ITEMTYP]
           ,[ITEMEXP]
           ,[PARENTREF]
           ,[HASCHILD]
           ,[FILTERREF])
		SELECT LOGICALREF,[USERID]
           ,[CUSTOM]
           ,[ITEMTYP]
           ,[ITEMEXP]
           ,[PARENTREF]
           ,[HASCHILD]
           ,[FILTERREF] FROM [MYDB].[dbo].[YT_RESTORE_LG_SATI]
		SET IDENTITY_INSERT [MYDB].[dbo].[LG_SATI] OFF
	END


IF EXISTS(SELECT 1 FROM [MYDB].[dbo].[LG_CVARPASG] WITH(NOLOCK) WHERE LOGICALREF>0)
    BEGIN
	IF OBJECT_ID(N'[MYDB].[dbo].[YT_RESTORE_LG_CVARPASG]', N'U') IS NOT NULL  DROP TABLE [MYDB].[dbo].[YT_RESTORE_LG_CVARPASG];  
        SELECT * INTO [MYDB].[dbo].[YT_RESTORE_LG_CVARPASG] FROM [MYDB].[dbo].[LG_CVARPASG]
    END
ELSE
	BEGIN
		SET IDENTITY_INSERT [MYDB].[dbo].[LG_CVARPASG] ON
		INSERT INTO [MYDB].[dbo].[LG_CVARPASG]
				   (LOGICALREF,[CSTVNDREF]
				   ,[ARPREF]
				   ,[FIRMNO]
				   ,[SITEID]
				   ,[RECSTATUS]
				   ,[ORGLOGICREF]
				   ,[DEFAULTFLG])
		SELECT LOGICALREF,[CSTVNDREF]
				   ,[ARPREF]
				   ,[FIRMNO]
				   ,[SITEID]
				   ,[RECSTATUS]
				   ,[ORGLOGICREF]
				   ,[DEFAULTFLG] FROM [MYDB].[dbo].[YT_RESTORE_LG_CVARPASG]
		SET IDENTITY_INSERT [MYDB].[dbo].[LG_CVARPASG] OFF
	END

IF EXISTS(SELECT 1 FROM [MYDB].[dbo].[LG_CSTVND] WITH(NOLOCK) WHERE LOGICALREF>0)
    BEGIN
	IF OBJECT_ID(N'[MYDB].[dbo].[YT_RESTORE_LG_CSTVND]', N'U') IS NOT NULL  DROP TABLE [MYDB].[dbo].[YT_RESTORE_LG_CSTVND];  
        SELECT * INTO [MYDB].[dbo].[YT_RESTORE_LG_CSTVND] FROM [MYDB].[dbo].[LG_CSTVND]
    END
ELSE
	BEGIN
			SET IDENTITY_INSERT [MYDB].[dbo].[LG_CSTVND] ON
			INSERT INTO MYDB.[dbo].[LG_CSTVND]
           (LOGICALREF
           ,[ACTIVE]
           ,[CARDTYPE]
           ,[CODE]
           ,[TITLE]
           ,[SPECODE]
           ,[CYPHCODE]
           ,[ADDR1]
           ,[ADDR2]
           ,[CITY]
           ,[COUNTRY]
           ,[ORIGIN]
           ,[POSTCODE]
           ,[TELNR1]
           ,[TELNR2]
           ,[FAXNR]
           ,[CLANGUAGE]
           ,[CCURRENCY]
           ,[WEBURL]
           ,[CUSTCAT]
           ,[GROUPORG]
           ,[PARENTORG]
           ,[TEXTINC]
           ,[SITEID]
           ,[ORGLOGICREF]
           ,[CAPIBLOCK_CREATEDBY]
           ,[CAPIBLOCK_CREADEDDATE]
           ,[CAPIBLOCK_CREATEDHOUR]
           ,[CAPIBLOCK_CREATEDMIN]
           ,[CAPIBLOCK_CREATEDSEC]
           ,[CAPIBLOCK_MODIFIEDBY]
           ,[CAPIBLOCK_MODIFIEDDATE]
           ,[CAPIBLOCK_MODIFIEDHOUR]
           ,[CAPIBLOCK_MODIFIEDMIN]
           ,[CAPIBLOCK_MODIFIEDSEC]
           ,[PRIMARYCONTREF]
           ,[COUNTRYCODE]
           ,[CITYCODE]
           ,[TOWNCODE]
           ,[TOWN]
           ,[DISTRICTCODE]
           ,[DISTRICT]
           ,[RECSTATUS]
           ,[RIVALFIRM]
           ,[TELCODES1]
           ,[TELCODES2]
           ,[FAXCODE]
           ,[GUID])
SELECT LOGICALREF,
            [ACTIVE]
           ,[CARDTYPE]
           ,[CODE]
           ,[TITLE]
           ,[SPECODE]
           ,[CYPHCODE]
           ,[ADDR1]
           ,[ADDR2]
           ,[CITY]
           ,[COUNTRY]
           ,[ORIGIN]
           ,[POSTCODE]
           ,[TELNR1]
           ,[TELNR2]
           ,[FAXNR]
           ,[CLANGUAGE]
           ,[CCURRENCY]
           ,[WEBURL]
           ,[CUSTCAT]
           ,[GROUPORG]
           ,[PARENTORG]
           ,[TEXTINC]
           ,[SITEID]
           ,[ORGLOGICREF]
           ,[CAPIBLOCK_CREATEDBY]
           ,[CAPIBLOCK_CREADEDDATE]
           ,[CAPIBLOCK_CREATEDHOUR]
           ,[CAPIBLOCK_CREATEDMIN]
           ,[CAPIBLOCK_CREATEDSEC]
           ,[CAPIBLOCK_MODIFIEDBY]
           ,[CAPIBLOCK_MODIFIEDDATE]
           ,[CAPIBLOCK_MODIFIEDHOUR]
           ,[CAPIBLOCK_MODIFIEDMIN]
           ,[CAPIBLOCK_MODIFIEDSEC]
           ,[PRIMARYCONTREF]
           ,[COUNTRYCODE]
           ,[CITYCODE]
           ,[TOWNCODE]
           ,[TOWN]
           ,[DISTRICTCODE]
           ,[DISTRICT]
           ,[RECSTATUS]
           ,[RIVALFIRM]
           ,[TELCODES1]
           ,[TELCODES2]
           ,[FAXCODE]
           ,[GUID] FROM [MYDB].[dbo].[YT_RESTORE_LG_CSTVND]
SET IDENTITY_INSERT [MYDB].[dbo].[LG_CSTVND] OFF
	END

	/* EXEC YT_KONTROL_SATISTEKLIFYONETIMI_TABLOLARI */

C# DEVEXPRESS XTRAGRID KOLON SABITLE MENUSU

   private void gridView1_PopupMenuShowing(object sender, DevExpress.XtraGrid.Views.Grid.PopupMenuShowingEventArgs e)
        {
                if (e.MenuType == GridMenuType.Column)
                {
                    GridViewColumnMenu menu = e.Menu as GridViewColumnMenu;
                    if (menu.Column != null)
                    {
                        var myMenu = new DXMenuCheckItem("Sola - Kolon Sabitle/Geri Al", menu.Column.Fixed == FixedStyle.Left, default, new EventHandler(FreezeUnfreezeColumnLeft_Click));
                        myMenu.Image = global::MYAPP.Properties.Resources.Left;        //LEFT ARROW ICON FOR myMenu.Image = Left.png

                        myMenu.BeginGroup = true;
                        myMenu.Enabled = true;
                        myMenu.Tag = menu.Column;
                        e.Menu.Items.Add(myMenu);

                        var myMenu2 = new DXMenuCheckItem("Sağa - Kolon Sabitle/Geri Al", menu.Column.Fixed == FixedStyle.Right, default, new EventHandler(FreezeUnfreezeColumnRight_Click));
                        myMenu2.Image = global::MYAPP.Properties.Resources.Right; //RIGHT ARROW ICON FOR myMenu2.Image = Right.png
                        myMenu2.BeginGroup = false;
                        myMenu2.Enabled = true;
                        myMenu2.Tag = menu.Column;
                        e.Menu.Items.Add(myMenu2);
                    }
                }
	}

        private void FreezeUnfreezeColumnLeft_Click(object sender, EventArgs e)
        {
            DXMenuCheckItem item = sender as DXMenuCheckItem;
            GridColumn info = (GridColumn)item.Tag;
            if (info is null)
                return;
            if (info.Fixed == FixedStyle.Left)
            {
                info.Fixed = FixedStyle.None;
            }
            else
            {
                info.Fixed = FixedStyle.Left;
            }

        }

    private void FreezeUnfreezeColumnRight_Click(object sender, EventArgs e)
        {
            DXMenuCheckItem item = sender as DXMenuCheckItem;
            GridColumn info = (GridColumn)item.Tag;
            if (info is null)
                return;
            if (info.Fixed == FixedStyle.Right)
            {
                info.Fixed = FixedStyle.None;
            }
            else
            {
                info.Fixed = FixedStyle.Right;
            }
        }